C++ openssl RSA_private_decrypt和RSA_private_encrypt之间有什么区别?

C++ openssl RSA_private_decrypt和RSA_private_encrypt之间有什么区别?,c++,c,openssl,cryptography,rsa,C++,C,Openssl,Cryptography,Rsa,我不是数学家(请原谅我在这篇文章中说的话!),但据我所知,RSA加密和解密应该是相同的操作: M^e模块n 其中M是我想要解密/加密的,e是指数,n是模块(在我的例子中是私有的) 对这一点的确认如下:当我想要“签名”一个明文时,如果我执行以下任何操作,我将获得相同的签名: RSA_private_encrypt(plain_text.size(), &plain_text[0], &encrypted[0], rsa.get(), RSA_NO_PADDING); RSA_pr

我不是数学家(请原谅我在这篇文章中说的话!),但据我所知,RSA加密和解密应该是相同的操作: M^e模块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#U private#U encrypt文档声明“对于基于PKCS#1 v1.5的填充模式,flen必须小于RSA#U大小(RSA)-11,对于RSA#PKCS1_OAEP_填充模式,必须小于RSA#U大小(RSA)-41,对于RSA#U NO_填充模式,必须精确地小于RSA#U大小(RSA)”。如果操作是相同的,为什么我只有在加密情况下才有这个限制? 事实上,如果我尝试使用比RSA_大小(在我的例子中是1024)短的纯文本,则解密操作成功,而加密操作失败

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

:

RSA_private_encrypt()使用私钥RSA对from处的flen字节(通常是带有算法标识符的消息摘要)进行签名,并将签名存储在to中。必须指向RSA_大小(RSA)字节的内存

而:

RSA_private_decrypt()使用私钥RSA对位于的flen字节进行解密,并将明文存储到。to必须指向一个足够大的内存段,以容纳解密后的数据(小于RSA_size(RSA))。填充是用于加密数据的填充模式

你引用的这段话是为了文档中的
RSA\u public\u encrypt



如果未使用填充,则
RSA\u private\u encrypt
RSA\u private\u decrypt
将导致相同的操作。如果指定填充,则
RSA\u private\u encrypt
将在模幂运算之前向给定数据添加填充,而
RSA\u private\u decrypt
将在模幂运算之后尝试删除填充,其中,模幂运算意味着RSA操作
xc mod n
,其中
x
是给定的数据,
c
始终是私钥操作的私钥指数。

PHP不应该公开这些。。。糟糕的安全工程。。。。签名者应始终接收文档,应用消息格式并自己计算哈希。