La clé privée PEM lue par le vice-président exécutif ne fonctionne pas correctement

Lorsque je lance le code suivant, qui génère une clé, l’écrit dans une chaîne, l’imprime, la lit dans la clé et l’imprime à nouveau contre OpenSSL_1_0_2e :

 #include  #include  #include  #include  #include  #define RSA_KEYLEN 2048 int main() { // Key generation EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); EVP_PKEY* key = NULL; EVP_PKEY_keygen_init(ctx); EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, RSA_KEYLEN); EVP_PKEY_keygen(ctx, &key); EVP_PKEY_CTX_free(ctx); // Serialize to ssortingng unsigned char* keyStr; BIO *bio = BIO_new(BIO_s_mem()); PEM_write_bio_PrivateKey(bio, key, NULL, NULL, 0, 0, NULL); int priKeyLen = BIO_pending(bio); keyStr = (unsigned char*)malloc(priKeyLen + 1); BIO_read(bio, keyStr, priKeyLen); keyStr[priKeyLen] = '\0'; BIO_free_all(bio); // Print the ssortingng printf("%s", keyStr); // Reset the key EVP_PKEY_free(key); key = NULL; // Read from ssortingng bio = BIO_new(BIO_s_mem()); BIO_write(bio, keyStr, priKeyLen); PEM_read_bio_PrivateKey(bio, &key, NULL, NULL); BIO_free_all(bio); // Free the ssortingng free(keyStr); // Serialize to ssortingng (again) bio = BIO_new(BIO_s_mem()); PEM_write_bio_PrivateKey(bio, key, NULL, NULL, 0, 0, NULL); priKeyLen = BIO_pending(bio); keyStr = (unsigned char*)malloc(priKeyLen + 1); BIO_read(bio, keyStr, priKeyLen); keyStr[priKeyLen] = '\0'; BIO_free_all(bio); // Print ssortingng printf("%s", keyStr); } 

La clé privée est évidemment beaucoup trop courte dans la deuxième sortie. Qu’est-ce que je fais mal?

La solution à mon problème particulier était que j’essayais de définir les clés publique et privée sur EVP_PKEY en pensant que je devais charger les deux pour l’utiliser comme paire de clés. En fait, vous ne chargez que l’un des deux. Avec la clé privée, la clé publique est dérivée.