我不是数学家(我要求原谅我在这篇文章中所说的内容!),但据我所知,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),则解密操作会在加密失败时成功。
请注意,我没有使用填充(我知道这是不安全的。)
答案 0 :(得分:1)
RSA_private_encrypt()使用私钥rsa对来自flen字节(通常是带有算法标识符的消息摘要)进行签名,并将签名存储在。必须指向RSA_size(rsa)字节的内存。
RSA_private_decrypt()使用私钥rsa解密flen字节,并将明文存储到。必须指向足够大的内存部分来保存解密数据(小于RSA_size(rsa))。 padding是用于加密数据的填充模式。
您引用的段落适用于文档中的RSA_public_encrypt
。
如果未使用填充,则RSA_private_encrypt
和RSA_private_decrypt
将导致相同的操作。如果指定填充,则RSA_private_encrypt
将在模幂运算之前向给定数据添加填充,RSA_private_decrypt
将尝试在模幂运算后删除填充,模幂运算是指RSA操作xc mod n
,其中x
是给定数据,c
始终是私钥操作的私有指数。