openssl RSA_private_decrypt 和 RSA_private_encrypt 有什么区别
What is the difference between openssl RSA_private_decrypt and RSA_private_encrypt?
我不是数学家(我请求原谅我在这篇文章中所说的话!),但据我所知,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_encrypt
和RSA_private_decrypt
将导致相同的操作。如果指定填充,则RSA_private_encrypt
将在模幂之前向给定数据添加填充,RSA_private_decrypt
将尝试在模幂之后删除填充,其中模幂表示 RSA 操作xc mod n
其中x
是给定数据,c
始终是私钥操作的私有指数。
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::make_shared和protected/private构造函数
- WinCrypt RSA vs Java org.bouncycastle
- 使用 char 数组公钥的 OpenSSL 进行 RSA 加密
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- OpenSSL RSA 解密随机失败 C/C++
- C++ - "private"单身人士?
- 将复制构造函数设置为private和=delete有什么区别
- C# 中的 RSA 签名和 Crypto++ C++中的验证
- 库设计混乱.. "public"/"private"(模板)标题,库文件..?
- 如何通过 Crypto++ 和 RSA 对文件进行签名
- 我是否必须在类中的所有变量C++设置为 private?
- C++ 和 node.js 之间的 RSA 加密
- 从字符串 Crypto++ 导入 RSA 公钥/私钥
- QString& QString::operator=(const QByteArray&)' is private
- 在加密++中使用RSA加密对称AES密钥
- 错误 LNK2001:未解析的外部符号"private: static class Game Game::game_"
- C++项目需要什么才能使用证书 (RSA-SHA256) 对文件进行签名
- C++ API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL依赖项问题