After commented out the line "EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING)", it worked well.
However, I still quite understand the usage of "RSA_NO_PADDING".
Who could kindly explain this? Thanks, Jared, (韦煜) From: openssl-users <openssl-users-bounces@xxxxxxxxxxx> on behalf of Yu Wei <yu2003w@xxxxxxxxxxx>
Sent: Thursday, March 23, 2017 1:20:42 AM To: openssl-users@xxxxxxxxxxx Subject: One question about RSA decrypt with private key Hi guys,
I generated RSA private key and public key as below, openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048 openssl rsa -pubout -in pri.key -out pub.key
And encrypted text file as below, openssl pkeyutl -encrypt -pubin -inkey ~/pub.key -in ~/1.txt -out ~/1e.txt
Then I wrote below program to decrypt the encryted file. However, it seemed that decrypt didn't work as expected.
#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; }
When executing the code, the result is as below, [stack@agent ~]$ ./test
Initialize crypto library done load private key successfully data input length is 256 outlen is 256 decrypted data
Is there anything missed?
Thanks, Jared, (韦煜) |
-- openssl-users mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users