RSA-шифрование с использованием OpenSSL с использованием открытого ключа массива символов - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть открытый ключ, который хранится в переменной следующим образом:

static const char publicKey[] =
"-----BEGIN PUBLIC KEY-----\n\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCKFctVrhfF3m2Kes0FBL/JFeO\
cmNg9eJz8k/hQy1kadD+XFUpluRqa//Uxp2s9W2qE0EoUCu59ugcf/p7lGuL99Uo\
SGmQEynkBvZct+/M40L0E0rZ4BVgzLOJmIbXMp0J4PnPcb6VLZvxazGcmSfjauC7\
F3yWYqUbZd/HCBtawwIDAQAB\n\
-----END PUBLIC KEY-----";

Я хотел бы зашифровать с заполнением PKCS # 1 v1.5 (RSA_PKCS1_PADDING), но не могу понять, как загрузитьключ из памяти вместо файла:

void init()
{
    RSA* rsa = RSA_new();

    //what now?
    //rsa = PEM_read_RSA_PUBKEY(file, &rsa, NULL, NULL); //requires a file
}

void encrypt(unsigned char* data, int length)
{
    //can input buffer and output buffer be the same?
    RSA_public_encrypt(length, data, data, rsa, RSA_PKCS1_PADDING);
}

Кроме того, нужно ли вызывать какой-либо код очистки?

1 Ответ

0 голосов
/ 13 сентября 2018

Вам нужно создать bio и использовать функции, которые работают с ними:

BIO *mem = BIO_new_mem_buf(publicKey, -1);
RSA *rsa = PEM_read_bio_RSA_PUBKEY( mem, nullptr, nullptr, nullptr );
BIO_free( mem );
... // using rsa

Обработка ошибок явно опущена.

Кроме того, мне нужно вызывать любыекод очистки?

Да, вы всегда должны.Я бы использовал RAII с умными указателями:

using BIO_ptr = std::unique_ptr<BIO,int(BIO *)>;

BIO_ptr createMemBio( const char *str )
{
    return BIO_ptr{ BIO_new_mem_buf(str, -1), BIO_free };
}

и так далее

...