openssl RSA_private_decrypt 和 RSA_private_encrypt 有什么区别

What is the difference between openssl RSA_private_decrypt and RSA_private_encrypt?

本文关键字:RSA private 什么 区别 decrypt openssl encrypt      更新时间:2023-10-16

我不是数学家(我请求原谅我在这篇文章中所说的话!),但据我所知,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文档指出"对于基于 PKCS #1 v1.5 的填充模式,flen 必须小于 RSA_size(rsa) - 11,对于RSA_PKCS1_OAEP_PADDING小于 RSA_size(rsa) - 41,对于RSA_NO_PADDING,正好小于 RSA_size(rsa)"。如果操作相同,为什么我只在加密的情况下有此限制?事实上,如果我尝试使用短于 RSA_SIZE(在我的例子中为 1024)的纯文本,解密操作会成功,而加密会失败。

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

RSA_private_encrypt 说:

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

虽然RSA_private_decrypt 说:

RSA_private_decrypt() 使用私钥 RSA 解密 flen 字节,并将明文存储在 to 中。 必须指向足够大的内存部分,以容纳解密的数据(小于 RSA_size(RSA))。 填充是用于加密数据的填充模式。

您引用的段落旨在RSA_public_encrypt文档中的内容。


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