Laden PEM-kodierte private RSA-Schlüssel in der Crypto++
Oft Benutzer PEM-kodierte private RSA-Schlüssel. Crypto++ erfordert, dass diese Schlüssel werden im DER-format zu laden. Ich habe gefragt, die Leute manuell konvertieren Sie Ihre PEM-Dateien DER vorher mit openssl wie diese:
openssl pkcs8 -in in_file.pem -out out_file.der -topk8 -nocrypt -outform der
Das funktioniert, aber einige Leute verstehen nicht, wie zu tun, noch wollen Sie. Also ich würde zum umwandeln von PEM-Dateien in DER Dateien automatisch in das Programm.
Ist es so einfach wie striping die "-----BEGIN CERTIFICATE-----" und "-----END CERTIFICATE-----" aus dem PEM oder eine andere transformation erforderlich? Ich habe gesagt, dass zwischen diesen Marken, die es nur b64-codierte DER -. Hier ist etwas code, der veranschaulicht das Problem:
//load the private key
CryptoPP::RSA::PrivateKey PK;
CryptoPP::ByteQueue bytes;
try
{
CryptoPP::FileSource File( rsa.c_str(), true, new CryptoPP::Base64Decoder() );
File.TransferTo( bytes );
bytes.MessageEnd();
//This line Causes BERDecodeError when a PEM encoded file is used
PK.Load( bytes );
}
catch ( CryptoPP::BERDecodeErr )
{
//Convert PEM to DER and try to load the key again
}
Ich würde gerne vermeiden, dass system-Aufrufe von openssl und machen die Verwandlung komplett in Crypto++, so dass Benutzer können entweder format und die Dinge "einfach funktionieren". Vielen Dank für jeden Rat.
- Sind Sie auf der Suche nach einem in-memory-decoder, oder ist auf der Festplatte ein auch gut?
- jedes Beispiel, das mit Crypto++ machen würde.
- Crypto++ jetzt hat diese Unterstützung als add-on. Siehe PEM-Pack auf der Crypto++ - wiki.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist DER stream verschlüsselt mit Base64. Beachten Sie aber, neben striping beide BEGIN-und END-Marker, im Falle von RSA-key-format, die Sie auch brauchen, um Streifen irgendwelche flags, die eingefügt werden dürfen, zwischen die BEGIN-marker und die kodierten Daten. Nur der Verbleibende Teil kann erfolgreich Base64-dekodiert. Es scheint, dass Sie füttern das vollständige Zertifikat-Datei, um den decoder und repariert werden muss.
rsa
variable, oder schreiben SieCryptoPP::BufferedTransformation
dass macht die gleiche Arbeit.Ich weiß, das ist eine alte Frage, aber andere könnten das nützlich finden. Sobald Sie Streifen die Marken, die Sie sind Links mit dem 'inneren' - Taste material. Nach http://www.cryptopp.com/wiki/Keys_and_Formats#BER_and_DER_Encoding können Sie
BERDecodePrivateKey
um dieses zu laden. So laden Sie eine openssl-Schlüssel, dessen Marker beraubt, die Sie tun können, so etwas wieIm Juli 2014, eine PEM-Pack wurde für die Crypto++ Bibliothek. Die PEM-Pack ist eine teilweise Implementierung der message-Verschlüsselung erlaubt das Lesen und schreiben von PEM-kodierten Schlüssel und Parameter, einschließlich des verschlüsselten privaten Schlüssel. Die zusätzlichen Dateien, die Unterstützung für RSA, DSA, EC, ECDSA-Schlüssel und Diffie-Hellman-Parameter.
Seine add-on zu der Bibliothek, und nicht Teil der Bibliothek ist die richtige. Sie laden eine ZIP-Datei und fügen Sie fünf Quell-Dateien in die Bibliothek. Anschließend erstellen Sie die Bibliothek (Crypto++ automatisch nimmt Sie). Das ZIP enthält fünf zusätzliche Quelldateien, ein Skript zum erstellen von test-Schlüssel mit OpenSSL, einem C++ - Programm zu testen, das Lesen und schreiben der Schlüssel, und ein Skript, um zu überprüfen, die Schlüssel geschrieben von Crypto++ unter Verwendung von OpenSSL.
Hier ist, wie Sie es benutzen würden:
Wenn der Schlüssel verschlüsselt ist, dann sehen Sie hier, wie Sie laden. Die PEM-Pack re-Implementierung OpenSSL ist
EVP_BytesToKey
, so ist der Schlüssel-Ableitung funktioniert, und Sie können interop:Es gibt auch eine
PEM_Save
, so können Sie den Schlüssel direkt aus der Crypto++. Zum Beispiel:Sowie
PEM_Save
für einen verschlüsselten Schlüssel (oder Schlüssel, die Sie beabsichtigen zu verschlüsseln):PEM_Load
hat nicht brauchen einen Algorithmus, weil seine kodiert in der header gekapselt.PEM_Save
braucht einen Algorithmus, denn es gibt keine Standard-Algorithmus.