2009-08-31 16 views
6

¿Hay alguna forma de utilizar las claves RSA que he generado 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 abrir fácilmente.Uso de claves RSA generadas por Crypto ++ en OpenSSL

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

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

Respuesta

5

Tanto Crypto ++ como OpenSSL pueden manejar claves codificadas PKCS # 8. 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. Puede guardarlo en un archivo, enviar un mensaje.

El único problema es que la interfaz OpenSSL de PHP solo acepta el código PKCS # 8 codificado en PEM. 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 en la actualidad. No veo ninguna razón para usar Crypto ++ para aplicaciones de cifrado comunes como esta.

0

tratar 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 si podrá usar un solo archivo para ambos.

Solo he usado OpenSSL, así que no estoy seguro de las opciones que tiene con Crypto ++. Encontré el enlace de arriba buscando en Google estos términos: Crypto ++ RSA OpenSSL.

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

PEM es el formato de texto de OpenSSL.

+0

He visto esta publicación, pero estaba buscando una forma programática para eso, tal vez alguna clase Crypto ++ que pueda convertir desde y hacia el DER PKCS8 al codificador PEM utilizado por OpenSSL. – Vargas

+0

¿Has leído http://www.cryptopp.com/wiki/Key_Format? –

1

¿Hay alguna forma de utilizar las claves RSA que he generado 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 abrir fácilmente.

Sí. Además de las claves codificadas X.509 y PKCS # 8 (respuesta de ZZ Coder), también puede usar claves codificadas PEM, incluidas claves cifradas. El soporte para claves codificadas PEM fue donado al proyecto en julio de 2014 para interoperabilidad OpenSSL.

Para utilizar las claves codificadas PEM, debe buscar Crypto ++ PEM Pack y volver a compilar la biblioteca. El paquete PEM no es parte de la biblioteca Crypto ++ según lo provisto por Wei Dai en el Crypto++ website.

vez que instalar y volver a compilar, 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----- 

relacionadas: para otros parches útiles Crypto ++, véase la página Category:Patch en la wiki de Crypto ++.

Cuestiones relacionadas