【发布时间】:2017-06-10 11:06:18
【问题描述】:
我使用 Crypto++ 加密一个字符串文本,但是当我想通过 C# RSA 加密服务提供商对其进行解密时,我遇到了一个例外。
当使用 Crypto++ 多次使用恒定公钥加密相同的字符串时,我的代码会生成相同的密码字符串,而使用 C# RSA 加密服务提供程序会产生不同的结果(密码字符串)。
这个问题的主要原因(运行时错误)是否与不同类型的 RSA 有关?
我使用 Crypto++ 的加密代码如下:
string message((char*)"hi", 2);
Integer messageInteger((const byte *)message.data(), message.size());
Integer cipherMessage = hostPublicKey.ApplyFunction(messageInteger);
size_t len = cipherMessage.MinEncodedSize();
string str;
str.resize(len);
cipherMessage.Encode((byte *)str.data(), str.size(), Integer::UNSIGNED);
而Crypto++的解密代码是:
Integer cipherMessage1((byte *)str.data(), str.size());
int size1 = cipherMessage1.ByteCount();
Integer plainInteger = privateKey.CalculateInverse(prng, cipherMessage1);
string recovered;
size_t req = plainInteger.MinEncodedSize();
recovered.resize(req);
plainInteger.Encode((byte *)recovered.data(), recovered.size());
加密和解密操作在同一侧完成,但在另一侧的解密操作中有提到的问题。
【问题讨论】:
-
您在上面显示的 Crypto++ 代码似乎是 "Raw RSA"。很容易射中自己的脚,所以要非常小心。 "C# RSA 加密服务提供商..." - 您应该显示您的代码,但我怀疑您正在执行 PKCS 1.5 加密或类似的加密。 RSA Exponentiation(您在 Crypto++ 中执行的操作)和使用 PKCS 1.5 的 RSA Encryption(您在 C# 中执行的操作)不兼容。
-
" 虽然使用 C# RSA 加密服务提供程序有不同的结果(密码字符串)......" - 是的,PKCS 1.5 使用随机填充。每次加密看起来都不同,即使在相同的密钥和相同的消息下也是如此。
-
@jww 完全正确。您的 Crypto++ 应该直接替换。您不能通过期望某个密文来测试加密,因为密码应该始终执行密文的随机化。原始 RSA 容易受到 whole host of attacks 的攻击。 C# 可以使用 OAEP 或 PKCS#1 v1.5 填充,但如果您正在重新设计,请选择 OAEP 并且不要忘记签署您的消息以保护完整性和真实性。或者更好:聘请专业人士为您执行此操作,因为系统的安全性似乎存在风险。
-
相关,请参阅Load ASN.1/DER encoded RSA keypair in C#。它向您展示了如何将 Crypto++ 生成的密钥加载到 C# 中。
标签: c# c++ encryption cryptography crypto++