2012-08-09 8 views
5

Ich verwende öffentliche/private Schlüssel in meinem Projekt, um einige Daten zu verschlüsseln/entschlüsseln.Lesen des öffentlichen/privaten Schlüssels aus dem Speicher mit OpenSSL

Ich hosten einen öffentlichen Schlüssel ("public.pem") auf einem Server.

„public.pem“ sieht wie folgt aus:

-----BEGIN PUBLIC KEY----- 
..... 
..... 
-----END PUBLIC KEY----- 

ich eine Client-Seite geschrieben, die diesen öffentlichen Schlüssel herunterlädt und auf der Festplatte speichern und ruft dann OpenSSL PEM_read_RSA_PUBKEY() mit einem Dateideskriptor auf diese Datei. Diese Operation funktioniert gut und das Ergebnis ist ein RSA-Objekt, das für die Verschlüsselung bereit ist.

Ich möchte vermeiden, den öffentlichen Schlüssel jedes Mal auf die Festplatte schreiben (da ich den Puffer bereits im Speicher haben).

Wie kann ich die gleiche Operation ausführen, ohne den Puffer auf der Festplatte zu speichern? Ich bemerkte eine Funktion namens: PEM_read_bio_RSAPublicKey(), aber ich bin mir nicht sicher, ob es die BIO-Struktur verwendet. Bin ich auf dem richtigen Weg?

Die wirkliche Frage wäre also: Wie lese ich einen öffentlichen/privaten Schlüssel zu einem RSA-Objekt direkt aus dem Speicher und nicht aus einem Dateideskriptor.

Antwort

14

Sie sind auf dem richtigen Weg. Sie müssen den bereits im Speicher befindlichen PEM-Schlüssel mit einem BIO-Puffer über BIO_new_mem_buf() einpacken. Mit anderen Worten, so etwas wie:

BIO *bufio; 
RSA *rsa 

bufio = BIO_new_mem_buf((void*)pem_key_buffer, pem_key_buffer_len); 
PEM_read_bio_RSAPublicKey(bufio, &rsa, 0, NULL); 

Der gleiche Ansatz ist für einen privaten RSA-Schlüssel (via PEM_read_bio_RSAPrivateKey) gültig, aber in diesem Fall, dass Sie mit Sicherheit brauchen für die Passphrase gerecht zu werden. Überprüfen Sie die man page für Details.

+1

Ich habe diese Option gerade jetzt ausprobiert. Die Verschlüsselung war in Ordnung, die Entschlüsselung funktionierte nicht. Muss der öffentliche Schlüssel wie folgt aussehen oder muss ich den "BEGIN PUBLIC KEY" entfernen, wenn ich ihn an den Client sende? ----- BEGIN PUBLIC KEY ----- ..... ..... ----- ENDE ÖFFENTLICHER SCHLÜSSEL ----- – user1144031

+0

Der man page link ist gebrochen :(. Jeder hat den aktualisierten Link? – digawp

2

SquareRootOfTwentyThree Methode funktioniert nicht für mich. Hier ist meine Lösung.

BIO* bio = BIO_new(BIO_s_mem()); 
int len = BIO_write(bio, pem_key_buffer, pem_key_buffer_len); 
EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); 
RSA* rsa = EVP_PKEY_get1_RSA(evp_key); 
Verwandte Themen