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

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

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

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)-对于基于PKCS#1 v1.5的填充模式,小于RSA_size(rsa)-对于RSA_PKCS1_OAEP_PADDING小于41,对于RSA_size(rsa) RSA_NO_PADDING”。如果操作相同,为什么仅在加密情况下才有此限制?
实际上,如果我尝试使用短于RSA_SIZE(在我的情况下为1024)的纯文本,则解密操作成功,而加密失败。

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

最佳答案

RSA_private_encrypt says:



RSA_private_decrypt says:



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

如果不使用填充,那么RSA_private_encryptRSA_private_decrypt将导致相同的操作。如果指定填充,那么RSA_private_encrypt将在模块化幂运算之前将填充添加到给定的数据中,并且RSA_private_decrypt将尝试在模块化幂运算后删除填充,其中模块化幂表示RSA操作x mod n,其中x是给定数据,而c始终是给定数据的私有(private)指数私钥操作。

10-04 14:40