2016-07-08 24 views
3

Ich möchte ein Ecdsa-Schlüsselpaar generieren und es in der PEM-Datei speichern. Hier ist der Code, den ich den Schlüssel erzeugen.Lesen und Schreiben von OpenSSL ECDSA-Schlüsseln in die PEM-Datei

#include <openssl/ec.h>  // for EC_GROUP_new_by_curve_name, EC_GROUP_free, EC_KEY_new, EC_KEY_set_group, EC_KEY_generate_key, EC_KEY_free 
#include <openssl/ecdsa.h> // for ECDSA_do_sign, ECDSA_do_verify 
#include <openssl/obj_mac.h> // for NID_secp256k1 

/* 
* Function generate_eckey 
* ----------------------- 
* 
* This function generates an EC_Key object that stores the ECDSA key pair. 
* 
* return: ec key pair 
*/ 
EC_KEY * generate_eckey() { 
    EC_KEY *eckey=EC_KEY_new(); 
    EC_GROUP *ecgroup= EC_GROUP_new_by_curve_name(NID_secp256k1); 
    EC_KEY_set_group(eckey, ecgroup); 
    EC_KEY_generate_key(eckey); 

    return eckey; 
} 


int main() { 

    // generate a eckey used to produce signatures 
    EC_KEY *eckey = generate_eckey(); 

    return 0; 
} 

Jetzt habe ich dieses Schlüsselpaar, das verwendet werden kann, um Nachrichten zu signieren und zu verifizieren. Ich möchte die Informationen in einer Datei speichern, damit ich sie das nächste Mal einfach laden kann.

Ich möchte wissen, wie kann ich die Schlüssel zu einer PEM-Datei schreiben und laden? Hat openssl eine bestehende Funktion dazu? Mir ist egal, ob die Schlüssel in irgendeinem Format kodiert sind, solange nach dem Laden ich es benutzen kann. Jedes Beispiel wäre großartig.

+1

Das ist von 2009 (und das OP hatte Probleme), aber es sieht aus wie es Funktionsaufrufe, die tun, was Sie wollen. Einige der Ergebnisse, die das OP gemacht hat, werden wahrscheinlich zu einer Lösung führen: http://openssl.6102.n7.nabble.com/Can-not-write-a-EC-KEY-to-a-PEM-file-td23490 .html – yano

Antwort

0

Ich möchte wissen, wie kann ich die Schlüssel zu einer PEM-Datei schreiben und laden? Hat openssl eine bestehende Funktion dazu?

Ja, OpenSSL hat bestehende Funktionen. Verwenden Sie für ASN.1/DER d2i_ECPrivateKey und d2i_EC_PUBKEY; und für PEM verwenden Sie PEM_read_ECPrivateKey und PEM_read_EC_PUBKEY. Die Schreibfunktionen sind ähnlich und in den man-Seiten dokumentiert.

d2i_* ist "DER zu intern", und es wird verwendet, um ASN.1/DER-Schlüssel zu lesen. Die Schreibfunktionen verwenden i2d_* und ihre "interne zu DER". PEM verwendet kein kryptisches Präfix.

Ein Beispiel für die Verwendung von d2i_* und PEM_* mit RSA-Schlüsseln in einem C++ - Programm mit dem Ausgang finden Sie unter Use OpenSSL RSA key with .Net. Sie können einfach Ihre EC-Funktionen anstelle der RSA-Funktionen austauschen.


EC_KEY * generate_eckey() { 
    EC_KEY *eckey=EC_KEY_new(); 
    EC_GROUP *ecgroup= EC_GROUP_new_by_curve_name(NID_secp256k1); 
    EC_KEY_set_group(eckey, ecgroup); 
    EC_KEY_generate_key(eckey); 

    return eckey; 
} 

Verwandte, wenn Sie EC-Schlüssel, sollten Sie eine benannte Kurve verwenden, durch den Aufruf EC_KEY_set_asn1_flag(ecKey, OPENSSL_EC_NAMED_CURVE) schreiben. Wenn Sie das nicht tun, können die Schlüssel nur eingeschränkt genutzt werden. Siehe auch Elliptic Curve Cryptography | Named Curves im OpenSSL-Wiki.

Außerdem ignorieren Sie die Rückgabewerte von Funktionen wie und EC_KEY_generate_key. Vielleicht möchten Sie diese Strategie überdenken, da diese Funktion aus nicht offensichtlichen Gründen, wie etwa einer Richtlinieneinstellung, fehlschlagen kann. Siehe auch EC_KEY_new Manpages.

+0

Ich habe in Ihrem vorherigen Beitrag gesehen, dass Sie zuerst den RSA-Schlüssel in PKEY konvertieren. Muss ich das auch für EC_KEY anwenden? BTW Ich weiß nicht, C++, so ist es bitter für mich, den Code zu lesen. – Luke