我不是数学家(我想宽恕我在这篇文章中所说的!),但据我所知,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_encrypt
和RSA_private_decrypt
将导致相同的操作。如果指定填充,那么RSA_private_encrypt
将在模块化幂运算之前将填充添加到给定的数据中,并且RSA_private_decrypt
将尝试在模块化幂运算后删除填充,其中模块化幂表示RSA操作x mod n
,其中x
是给定数据,而c
始终是给定数据的私有(private)指数私钥操作。