Saltar al contenido

Lectura de clave pública/privada de la memoria con OpenSSL

Presta atención porque en este enunciado encontrarás la solución que buscas.Este escrito ha sido evaluado por nuestros especialistas para asegurar la calidad y veracidad de nuestro contenido.

Solución:

Estás en el camino correcto. Debe envolver el PEM key ya en la memoria por medio de un búfer BIO a través de BIO_new_mem_buf(). En otras palabras, algo 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 un RSA privado key (a través de PEM_read_bio_RSAPrivateKey), pero en ese caso seguramente necesitará tener en cuenta la frase de contraseña. Consulte la página del manual para obtener más información.

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

Aquí hay un ejemplo completo, que muestra incrustado keyy cómo usar punteros únicos de C++ 11 para administrar los recursos de OpenSSL.

Actualizado: siguiendo los comentarios de los espectros. Ya no usa la especialización de default_delete.

/* compile with:

    c++ -Wall -pedantic  -std=c++17 main.cc  -lssl -lcrypto -o main
*/

#include 
#include 

#include 
#include 

#include 
#include 

/* Custom deletors for use with unique_ptr */

struct EVP_PKEY_deleter 
  void operator()(EVP_PKEY* p) const 
      if (p)
        EVP_PKEY_free(p);
  
;

struct BIO_deleter 
  void operator()(BIO* p) const 
      if (p)
        BIO_free(p);
  
;

/* Smart pointers wrapping OpenSSL resources */

using evp_key_ptr = std::unique_ptr;
using bio_ptr = std::unique_ptr;

/* Create key based on memory contents */

evp_key_ptr load_public_key(const char* buf, size_t len)

  bio_ptr bp (BIO_new_mem_buf((void*) buf, len));
  if (!bp)
    throw std::runtime_error("BIO_new_mem_buf failed");

  EVP_PKEY * kp = nullptr;

  kp = PEM_read_bio_PUBKEY(bp.get(), &kp, nullptr, nullptr);
  ERR_print_errors_fp(stderr);
  return evp_key_ptrkp;



int main()

  const char * RSA_PUBLIC_KEY=R"(
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA80ZqDPPW5eOH6TWdLsEJ
8qf6hoMJfFZ3BL9Fz+YNGeBpF3zxKmm8UuRrBHHVZZB2Gs1MTo06IU3fqDfFsOyh
J6pHeJF3wyUlYZuYbGAyMlZZ/+M5TOvo92f7lt/A40QThCVf1vS5o+V8sFkgnz3N
C7+VvC4dYrv+fwnmnWGxPy1qfp3orB+81S4OPRiaoy+cQBZs10KCQaNBI/Upzl2R
3dMkWKM+6yQViKTHavT4DRRZ1MKp9995qOR3XfhhJdWuDl4moXcU3RcX4kluvS5q
b8oTnVyd2QB1GkUw6OKLWB/5jN1V1WzeYK447x2h4aPmJfsn5gCFJs6deq2RFQBR
SQIDAQAB
-----END PUBLIC KEY-----
)";
  ERR_load_crypto_strings();
  ERR_free_strings();

  auto pubkey = load_public_key(RSA_PUBLIC_KEY, strlen(RSA_PUBLIC_KEY));
  if (pubkey)
    std::cout << "load_public_key success" << std::endl;

Aquí tienes las reseñas y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *