Pregunta

¿Hay alguna forma de utilizar las claves RSA que generé con la API Crypto++ en OpenSSL?Lo que estoy buscando es una forma de almacenar las claves en un formato que tanto Crypto++ como OpenSSL puedan abrirlas fácilmente.

Estoy escribiendo un esquema de licencia y me gustaría verificar firmas y descifrar archivos usando la API Crypto++, pero para generar los archivos de licencia me gustaría usar una interfaz web (probablemente usando PHP, que solo admite OpenSSL) para generar y cifrar/ firmar las licencias.

Escribiría ambas aplicaciones usando Crypto++ y las llamaría desde PHP, pero dado que la clave privada se almacenará en forma cifrada, se debe pasar una contraseña a la aplicación y pasarla en la línea de comando no parece ser una buena opción. idea para mí.

¿Fue útil?

Solución

Tanto Crypto ++ y OpenSSL pueden manejar PKCS # 8 llaves codificadas. En Crypto ++, puede generar claves y convertir a PKCS # 8 memoria intermedia de este tipo,

AutoSeededRandomPool rng;
RSAES_OAEP_SHA_Decryptor priv(rng, 2048);
string der;
StringSink der_sink(der);
priv.DEREncode(der_sink);
der_sink.MessageEnd();

// der.data() is the bytes you need

Ahora sólo tiene que pasar los bytes de PHP. Se puede guardar en un archivo, enviar en un mensaje.

El único Gotcha es que la interfaz de OpenSSL de PHP sólo acepta PEM codificado PKCS # 8. Usted puede convertir fácilmente búfer DER-codificado en PEM como esta en PHP,

<?php
function pkcs8_to_pem($der) {

    static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----";
    static $END_MARKER = "-----END PRIVATE KEY-----";

    $value = base64_encode($der);

    $pem = $BEGIN_MARKER . "\n";
    $pem .= chunk_split($value, 64, "\n");
    $pem .= $END_MARKER . "\n";

    return $pem;
}
?>

También puede convertir PKCS # 8 de PEM en C ++, si lo prefiere. El algoritmo es muy simple como se puede ver en el código PHP.

OpenSSL es tan frecuente hoy en día. No veo ninguna razón para utilizar Crypto ++ para aplicaciones criptográficas comunes de este tipo.

Otros consejos

  

¿Hay una manera de utilizar las claves RSA que he generado con la API de Crypto ++ en OpenSSL? Lo que estoy buscando es una manera de almacenar las claves en un formato que tanto Crypto ++ y OpenSSL pueden abrir fácilmente.

Sí. Además de X.509 y PKCS # 8 llaves codificadas (respuesta de ZZ Coder), también se puede utilizar PEM llaves codificadas incluyendo claves cifradas. Soporte para llaves PEM codificado fue donado al proyecto en julio de 2014 para la interoperabilidad de OpenSSL.

Para utilizar las teclas PEM codificado, es necesario buscar el Crypto ++ PEM Paquete y recompilar el biblioteca. El paquete de PEM no es parte de la biblioteca Crypto ++ conforme a lo dispuesto por Wei Dai en el página web Crypto ++ .

Una vez que instale y recompilar, su tan simple como:

// Load a RSA public key
FileSource fs1("rsa-pub.pem", true);
RSA::PublicKey k1;
PEM_Load(fs1, k1);

// Load a encrypted RSA private key
FileSource fs2("rsa-enc-priv.pem", true);
RSA::PrivateKey k2;
PEM_Load(fs2, k2, "test", 4);

// Save an EC public key
DL_PublicKey_EC<ECP> k16 = ...;
FileSink fs16("ec-pub-xxx.pem", true);
PEM_Save(fs16, k16);

// Save an encrypted EC private key
DL_PrivateKey_EC<ECP> k18 = ...;
FileSink fs18("ec-enc-priv-xxx.pem", true);
PEM_Save(fs18, k18, "AES-128-CBC", "test", 4);

Las teclas se parecen a lo que en el disco:

$ cat rsa-pub.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCg7ovcljEjZCFOdLWENBKE6FSk
Nke6OP79SMJABJw+JoEBpNddK6/v99IvA1qU76V0V4k8qLvhkVUtk9FArhhRsxeF
1fd8UVqgsT8j0YCVFcJ/ZA372ogpXyvc5aK9mZEiKE5TIF8qnDFFZiMWPrad1buk
hg+eFdo78QRLA5plEQIDAQAB
-----END PUBLIC KEY-----
$  
$ cat rsa-enc-priv.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E1A759E11CA515CE34B6E8CE5278C919

slMx02TMblahTedEKsfS+qYYo4nZFaqI3PhCRYmE5zUa9clHm7yo36wIk3oo52OB
f4AhOaJwiPQAbLe/kDHeP77iHd/4+hFNq/Haj6ahWRpXilLVOETLtefbzSGO8va3
ORnwQpPThs2V0EetPU3LB3QcA/XRjWDzyNa7+LydOjKwbQdZnF/jND5NCkEkncNM
iQJ1VWubN+Xs3Rx0CfLu5Chl1n7WnmCNMtLL/LtYeaR1SlRJa6BaF7hNHJJJ3+Jc
8curCKlpobs+XnlDfjyqgTXolkiepn95TnT7KSqi3BqVEpq/5LKMnkDJg6nwUR7A
w0jLNr1f8adWyBEj2Dp0D/jy8eDh65eHdJw4s8G5FZfBud1zWbvRQ3Ah70ISUKa3
4q/6z2vervPgoc+rMVYDvRf/mqa4LMXYhuygsyx50OgPldCC2d0cVVFCg/ljdEzO
UV5rSkK1Qczv8Nc1ZdY3fJA+qYIV8JqPPY+dJ2312R+myPi5Av0/69k8lZN5eIJk
SkiiFQmabhc+o6z4RFA52a3lOud3eGM9L5nbFQGc5COzQVZ6y8t06tLIp9Y5zjA4
KTgNncV5eq3Bau+cWXjP6pJRixFVfwIoy95mAur7B2P1iE4FXyZbvCovPL6vilT5
kSqAo7Znu0RpTjE36tWY6tFt+GU7k8EBrjA3Qi+8xxqyYtr57Ns+H/j+hhJTN8L7
IXoevwS81OPiB0Dmg6wLLXATG1+gCNXb8sd5U2eJhy4LOJA3y54CTgRnPXtM38CH
K+JvnDstyUl9IGTsgUz51ZzyJNZGU9Ro3pt/a3Cs5IJumaygZ0LQ44WBw9m/vja9
-----END RSA PRIVATE KEY-----
$  
$ cat ec-pub.pem
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEVwXjdIb2yy25QbIO0XiIHpySXwSpIAcz
v0Wdyq+fZ6BdJjs2jKvbs9pcRJn8yxlASWoz2R4NoHTZ2YokKsDfEg==
-----END PUBLIC KEY-----
$  
$ cat ec-enc-priv.pem
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,F1DBC73E26DCD310888932C2762B3512

nikex48SFvtNOIrOEDipwmxaghjn4jtrvwI3d1H/VNq9yp26WqFZxBJCUPFBFLjH
auA+AHeUo3BVkNQPs0VO4FD5xR50mtc2tCJizzhyTTTypLc3lRkxmD1MpeZnWRy2
70foVtNSvLL/QLJqNJGm/G9kl0xPN4zAfOq7Txoscnk=
-----END EC PRIVATE KEY-----

Relacionado: para otros parches útiles Crypto ++, consulte el Categoría: Parche en la página Crypto ++ wiki.

Trate de este enlace: http://www.cryptopp.com/fom-serve/cache/62. html

Parece que tendrá que utilizar PKCS # 8 y convertir de DER a formato PEM para poder utilizar las teclas de OpenSSL. No estoy seguro de si va a ser capaz de utilizar un único archivo para ambos.

Sólo he utilizado OpenSSL así que no estoy seguro de qué opciones tiene con Crypto ++. He encontrado el enlace anterior mediante la búsqueda en Google para estos términos:. Crypto ++ RSA OpenSSL

DER es el formato binario de OpenSSL para las claves y certificados.

PEM es formato de texto de OpenSSL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top