[openssl-users] One question about RSA decrypt with private key
Matt Caswell
matt at openssl.org
Thu Mar 23 10:05:43 UTC 2017
On 23/03/17 05:29, Yu Wei wrote:
> 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?
>
RSA_NO_PADDING gives you "raw" RSA encryption. From the manual:
RSA_NO_PADDING
Raw RSA encryption. This mode should only be used to implement
cryptographically sound padding modes in the application code.
Encrypting user data directly with RSA is insecure.
https://www.openssl.org/docs/man1.1.0/crypto/RSA_public_encrypt.html
Basically, unless you are implementing a new RSA padding mode, or really
know what you are doing, don't use it.
Matt
> Thanks,
>
> Jared, (韦煜)
> Software developer
> Interested in open source software, big data, Linux
>
> ------------------------------------------------------------------------
> *From:* openssl-users <openssl-users-bounces at openssl.org> on behalf of
> Yu Wei <yu2003w at hotmail.com>
> *Sent:* Thursday, March 23, 2017 1:20:42 AM
> *To:* openssl-users at openssl.org
> *Subject:* [openssl-users] 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 at 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, (韦煜)
> Software developer
> Interested in open source software, big data, Linux
>
>
>
More information about the openssl-users
mailing list