Lecture de clés publiques / privées à partir de la mémoire avec OpenSSL

J’utilise des clés publiques / privées dans mon projet pour chiffrer / déchiffrer certaines données.

J’héberge une clé publique (“public.pem”) sur un serveur.

“public.pem” ressemble à ceci:

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

J’ai écrit un côté client qui télécharge cette clé publique et l’enregistre sur un disque, puis appelle PEM_read_RSA_PUBKEY () d’OpenSSL avec un descripteur de fichier dans ce fichier. Cette opération fonctionne très bien et le résultat est un object RSA prêt à être chiffré.

Je voudrais éviter d’écrire la clé publique sur le disque à chaque fois (puisque j’ai déjà le tampon en mémoire).

Comment puis-je faire la même opération sans enregistrer le tampon sur le disque? J’ai remarqué une fonction appelée: PEM_read_bio_RSAPublicKey () mais je ne suis pas sûr de son utilisation de la structure BIO. Suis-je sur le bon chemin?

La vraie question serait donc: comment lire une clé publique / privée dans un object RSA directement à partir de la mémoire et non à partir d’un descripteur de fichier.

Tu es sur la bonne piste. Vous devez envelopper la clé PEM déjà en mémoire au moyen d’un tampon BIO via BIO_new_mem_buf() . En d’autres termes, quelque chose comme:

 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); 

La même approche est valable pour une clé privée RSA (via PEM_read_bio_RSAPrivateKey ), mais dans ce cas, vous devez impérativement prendre en compte la phrase PEM_read_bio_RSAPrivateKey . Consultez la page de manuel pour plus de détails.

La méthode de SquareRootOfTwentyThree ne fonctionne pas pour moi. Voici ma solution.

 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);