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;