Utilizzando Crypto++ si generano chiavi RSA su OpenSSL
-
20-09-2019 - |
Domanda
C'è un modo per utilizzare le chiavi RSA che ho generato con l'API Crypto++ in OpenSSL?Quello che sto cercando è un modo per archiviare le chiavi in un formato in cui sia Crypto++ che OpenSSL possano aprirle facilmente.
Sto scrivendo uno schema di licenza e vorrei verificare le firme e decrittografare i file utilizzando l'API Crypto++, ma per generare i file di licenza vorrei utilizzare un'interfaccia web (probabilmente utilizzando PHP, che supporta solo OpenSSL) per generare e crittografare/ firmare le licenze.
Vorrei scrivere entrambe le applicazioni utilizzando Crypto++ e chiamarlo dal PHP, ma poiché la chiave privata verrà archiviata in forma crittografata, è necessario passare una password all'applicazione e passarla sulla riga di comando non sembra essere una buona soluzione idea per me.
Soluzione
Sia Crypto++ che OpenSSL possono gestire chiavi codificate PKCS#8.In crypto++, puoi generare chiavi e convertirle nel buffer PKCS#8 in questo modo,
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
Ora devi solo passare i byte a PHP.Puoi salvarlo in un file, inviarlo in un messaggio.
L'unico problema è che l'interfaccia OpenSSL di PHP accetta solo PKCS#8 con codifica PEM.Puoi facilmente convertire il buffer con codifica DER in PEM come questo in 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;
}
?>
Se preferisci, puoi anche convertire PKCS#8 in PEM in C++.L'algoritmo è molto semplice come puoi vedere dal codice PHP.
OpenSSL è così diffuso al giorno d'oggi.Non vedo alcun motivo per utilizzare Crypto++ per applicazioni crittografiche comuni come questa.
Altri suggerimenti
C'è un modo per utilizzare le chiavi RSA che ho generato con l'API Crypto++ in OpenSSL?Quello che sto cercando è un modo per archiviare le chiavi in un formato in cui sia Crypto++ che OpenSSL possano aprirle facilmente.
SÌ.Oltre alle chiavi codificate X.509 e PKCS #8 (risposta di ZZ Coder), puoi anche utilizzare chiavi codificate PEM, comprese le chiavi crittografate.Il supporto per le chiavi codificate PEM è stato donato al progetto nel luglio 2014 per l'interoperabilità OpenSSL.
Per utilizzare le chiavi codificate PEM, è necessario recuperare il file Crypto++ Pacchetto PEM e ricompilare la libreria.Il pacchetto PEM non fa parte della libreria Crypto++ fornita da Wei Dai su Sito web Crypto++.
Una volta installato e ricompilato, è semplice come:
// 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);
Le chiavi appaiono così sul 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-----
Imparentato:per altre utili patch Crypto++, vedere il Categoria:Patch pagina sul wiki Crypto++.
Prova questo collegamento:http://www.cryptopp.com/fom-serve/cache/62.html
Sembra che dovrai utilizzare PKCS#8 e convertire dal formato DER al formato PEM per poter utilizzare le chiavi in OpenSSL.Non sono sicuro che sarai in grado di utilizzare un singolo file per entrambi.
Ho usato solo OpenSSL quindi non sono sicuro di quali opzioni hai con Crypto++.Ho trovato il link qui sopra cercando su Google questi termini:Crypto++ RSA OpenSSL.
DER è il formato binario di OpenSSL per chiavi e certificati.
PEM è il formato testo di OpenSSL.