openssl RSA_private_decrypt和RSA_private_encrypt有什么区别?

时间:2016-04-21 10:03:20

标签: c++ c openssl cryptography rsa

我不是数学家(我要求原谅我在这篇文章中所说的内容!),但据我所知,RSA加密和解密应该是相同的操作: M ^ e mod n

其中M是我想要解密/加密的,e是指数,n是模块(在我的情况下是私有的)。

对此的确认如下:当我想“签署”明文时,如果我执行以下任何操作,我将获得相同的签名:

RSA_private_encrypt(plain_text.size(), &plain_text[0], &encrypted[0], rsa.get(), RSA_NO_PADDING);

RSA_private_decrypt(plain_text.size(), &plain_text[0], &decrypted[0], rsa.get(), RSA_NO_PADDING);

我的问题是:RSA_private_encrypt文档指出“flen必须小于RSA_size(rsa) - 11对于基于PKCS#1 v1.5的填充模式,小于RSA_size(rsa) - 41对于RSA_PKCS1_OAEP_PADDING并且正好是RSA_size( rsa)for RSA_NO_PADDING“。如果操作相同,为什么我只在加密情况下才有这个限制? 实际上,如果我尝试使用短于RSA_SIZE的纯文本(在我的情况下为1024),则解密操作会在加密失败时成功。

请注意,我没有使用填充(我知道这是不安全的。)

1 个答案:

答案 0 :(得分:1)

RSA_private_encrypt says

  

RSA_private_encrypt()使用私钥rsa对来自flen字节(通常是带有算法标识符的消息摘要)进行签名,并将签名存储在。必须指向RSA_size(rsa)字节的内存。

RSA_private_decrypt says

  

RSA_private_decrypt()使用私钥rsa解密flen字节,并将明文存储到。必须指向足够大的内存部分来保存解密数据(小于RSA_size(rsa))。 padding是用于加密数据的填充模式。

您引用的段落适用于文档中的RSA_public_encrypt

如果未使用填充,则RSA_private_encryptRSA_private_decrypt将导致相同的操作。如果指定填充,则RSA_private_encrypt将在模幂运算之前向给定数据添加填充,RSA_private_decrypt将尝试在模幂运算后删除填充,模幂运算是指RSA操作xc mod n,其中x是给定数据,c始终是私钥操作的私有指数。