EVP_KEY erhält den privaten Rohschlüssel in C

Schönen Tag,

Ich habe versucht, eine einfache Übung zu machen, bei der ich den öffentlichen und den privaten Schlüssel mit RSA mit Openssl generieren und beide ausdrucken könnte. Mein Code sieht in etwa so aus:

size_t private_key_len = KEY_LENGTH;
EVP_PKEY *pkey = EVP_RSA_gen(KEY_LENGTH);
if (pkey == NULL)
{
    fprintf(stderr, "error: rsa gen\n");
    ERR_print_errors_fp(stderr);
    return NULL;
}
unsigned char *private_key = calloc((KEY_LENGTH + 1),sizeof(unsigned char));
EVP_PKEY_get_raw_private_key(pkey, private_key, &private_key_len);
printf("%s\n",private_key);

Normalerweise sollte es also den privaten Schlüssel drucken, vorausgesetzt, dass KEY_LENGTH 1024 ist, aber es druckt einfach nichts (die von calloc initialisierten Nullen). Ich habe es auch mit malloc versucht, das Ergebnis ist ähnlich, der einzige Unterschied besteht darin, dass es 0xBE druckt.

Das Array private_key wird also im Grunde nie gefüllt, und ich habe keine Ahnung warum.

Was fehlt mir, damit das funktioniert? Danke im Voraus!

🤔 А знаете ли вы, что...
C имеет строгую типизацию, что способствует обнаружению ошибок во время компиляции.


76
1

Antwort:

Gelöst

Zitieren der Manpage mit geänderter Betonung:

EVP_PKEY_get_raw_private_key() füllt den von priv bereitgestellten Puffer mit rohen privaten Schlüsseldaten. Die Größe des Priv-Puffers sollte beim Eintritt in die Funktion in *len sein, und beim Verlassen wird *len mit der Anzahl der tatsächlich geschriebenen Bytes aktualisiert. Wenn der Puffer priv NULL ist, wird *len mit der Anzahl von Bytes gefüllt, die zum Speichern des Schlüssels erforderlich sind. Die aufrufende Anwendung ist dafür verantwortlich, sicherzustellen, dass der Puffer groß genug ist, um die privaten Schlüsseldaten zu empfangen. Diese Funktion funktioniert nur für Algorithmen, die rohe private Schlüssel unterstützen. Aktuell ist dies: EVP_PKEY_HMAC, EVP_PKEY_POLY1305, EVP_PKEY_SIPHASH, EVP_PKEY_X25519, EVP_PKEY_ED25519, EVP_PKEY_X448 oder EVP_PKEY_ED448.

Beachten Sie, dass RSA keiner der unterstützten Algorithmen ist.

Sie können einen RSA-Schlüssel "drucken", indem Sie entweder jede seiner Komponenten (n,e,d,p,q,dp,dp,qinv) in eine druckbare Form konvertieren, was EVP_PKEY_print_private für Sie erledigt, oder die Codierung des gesamten Schlüssels abrufen in PEM, das "druckbar" im Sinne von druckbaren und tippbaren Zeichen ist, aber nicht im Sinne von leicht verständlich (oder kopiert oder erstellt) von Menschen mit PEM_write_PrivateKey oder PEM_write_RSAPrivateKey.

Außerdem ist der Wert, den Sie an EVP_RSA_gen übergeben, in Bits, aber die Größe der angezeigten Komponenten eines RSA-Schlüssels (außer e, das klein ist) wird in Hex- oder Dezimalziffern oder (meistens) Base64-Zeichen angegeben.