использование RSA_NO_PADDING при расшифровке данных с помощью закрытого ключа RSA с использованием openssl libcrypto

Я сгенерировал закрытый ключ RSA и открытый ключ, как показано ниже,

openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in pri.key -out pub.key

И зашифрованный текстовый файл, как показано ниже,

openssl pkeyutl -encrypt -pubin -inkey ~/pub.key -in ~/1.txt -out ~/1e.txt

Тогда я написал ниже программу для расшифровки зашифрованного файла. Тем не менее, казалось, что расшифровка не работает, как ожидалось.

#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/conf.h>
#include <iostream>

using namespace std;

void
cleanup()
{
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
ERR_free_strings();
}

int
main(int argc, char** argv)
{
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
OPENSSL_config(nullptr);

cout<<"Initialize crypto library done"<<endl;

EVP_PKEY * key = EVP_PKEY_new();
if (key == nullptr) {
cout<<"Failed to contruct new key"<<endl;
return 1;
}
FILE * fpri = nullptr;
fpri = fopen("/home/stack/pri.key", "r");
if (fpri == nullptr) {
cout<<"Failed to load private key"<<endl;
return 1;
}
key = PEM_read_PrivateKey(fpri, &key, nullptr, nullptr);
if (key == nullptr) {
std::cout<<"Read private key failed"<<endl;
return 1;
}
cout<<"load private key successfully"<<endl;
EVP_PKEY_CTX *ctx = nullptr;
ctx = EVP_PKEY_CTX_new(key, nullptr);
EVP_PKEY_decrypt_init(ctx);
EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING);

size_t outlen = 0, inlen = 0;
unsigned char * out = nullptr, * in = nullptr;

char buf[1024];
FILE * fe = nullptr;
fe = fopen("/home/stack/1e.txt", "r");
size_t len = fread(buf, 1, sizeof(buf),  fe);
cout<<"data input length is "<<len<<endl;
EVP_PKEY_decrypt(ctx, NULL, &outlen, in, inlen);
cout<<"outlen is "<<outlen<<endl;

out = (unsigned char*)OPENSSL_malloc(outlen);
EVP_PKEY_decrypt(ctx, out, &outlen, in, inlen);
cout<<"decrypted data "<<out<<endl;
cleanup();

return 0;

}

При выполнении кода, результат, как показано ниже,

[stack@agent ~]$ ./test
Initialize crypto library done
load private key successfully
data input length is 256
outlen is 256
decrypted data

Казалось, длина расшифрованных данных была неправильной и не для печати.

Когда я закомментировал инструкцию «EVP_PKEY_CTX_set_rsa_padding (ctx, RSA_NO_PADDING);», она работала хорошо.

Я также пытался с RSA_PKCS1_OAEP_PADDING, он тоже не работал. Если RSA PADDING не установлен, это сработало.

Мой вопрос как ниже,

  1. Какой отступ используется в следующей команде?

    openssl pkeyutl -encrypt -pubin -inkey ~/pub.key -in ~/1.txt -out ~/1e.txt
    
  2. Необходимо ли заполнение для шифрования / дешифрования RSA? Если так, как я могу применить механизм заполнения?

1

Решение

Вы должны использовать EVP_PKEY_CTX_set_rsa_padding если вы используете не по умолчанию заполнение в openssl pkeyutl шифрования. Увидеть документация openssl pkeyutl для деталей о -rsa_padding_mode,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]