2012-08-09 25 views
5

Estoy usando Claves públicas/privadas en mi proyecto para cifrar/descifrar algunos datos.Lectura de clave pública/privada de la memoria con OpenSSL

Estoy alojando una clave pública ("public.pem") en un servidor.

"public.pem" tiene el siguiente aspecto:

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

me escribió un lado del cliente que descarga esta clave pública y guárdelo en el disco y luego llama PEM_read_RSA_PUBKEY de OpenSSL() con un descriptor de archivos en dicho archivo. Esta operación funciona muy bien y el resultado es un objeto RSA que está listo para el cifrado.

Me gustaría evitar escribir la clave pública en el disco cada vez (ya que tengo el búfer en la memoria ya).

¿Cómo puedo hacer la misma operación sin guardar el búfer en el disco? Noté una función llamada: PEM_read_bio_RSAPublicKey() pero no estoy seguro de su uso de la estructura BIO. ¿Estoy en el camino correcto?

Así que la verdadera pregunta sería: ¿Cómo leo una clave pública/privada de un objeto RSA directamente desde la memoria y no desde un descriptor de archivo?

Respuesta

14

Estás en el camino correcto. Debe envolver la clave PEM que ya está en la memoria mediante un búfer BIO a través del BIO_new_mem_buf(). En otras palabras, algo así como:

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

El mismo enfoque es válido para una clave privada RSA (a través de PEM_read_bio_RSAPrivateKey), pero en ese caso, que sin duda necesita para atender a la frase de paso. Compruebe man page para más detalles.

+1

Probé esa opción en este momento. El cifrado estaba bien, el descifrado no funcionaba. ¿La clave pública debe ser como la siguiente o necesito quitar la "BEGIN PUBLIC KEY" cuando la envío al cliente? ----- BEGIN PUBLIC KEY ----- ..... ..... ----- END CLAVE PÚBLICA ----- – user1144031

+0

El enlace de la página man está roto :(. Alguien tiene el enlace actualizado? – digawp

2

El método de SquareRootOfTwentyThree no funciona para mí. Aquí está mi solución.

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