3

我需要用 RSA 加密一些文本,然后使用私钥恢复它。我的问题是RSACryptoServiceProvider.Encrypt()每次输出不同的值,即使使用相同的键。这是我放入 LINQpad 进行测试的代码:

CspParameters cp = new CspParameters();
cp.KeyContainerName = "MyKey";
cp.Flags = CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// using LINQpad to verify the key is loaded properly -- same every time
rsa.ToXmlString(true).Dump();

byte[] rgb = new ASCIIEncoding().GetBytes("Hello world");
byte[] xx = rsa.Encrypt(rgb, false);
string b64 = Convert.ToBase64String(xx);

// this changes every time:
b64.Dump();

我猜测该类必须使用其他东西以及影响输出的关键,但我正在努力找出是什么。

4

2 回答 2

1

每次加密相同的明文时密文都不同的事实并不意味着它不能被一致地解密。
这确实是一个好的密码算法能够具有这种行为的标志,使其对各种攻击更具弹性。

这是因为加密逻辑在过程中引入了随机性,例如通过在明文本身之前系统地添加一些随机字节。只要解密逻辑知道在整个密文被解密后忽略这些字节,它就可以重现原始明文。

我建议你取这个 b64 文本的任何实例,将它提交到相反的过程,并查看生成的“rgb”在所有情况下都是“Hello world”。

于 2011-10-28T12:06:05.287 回答
1

不同的输出是完全正常的。这是因为您的数据正在由 PKCS#1 或 OAEP 填充 - 并且两者都在使用/添加一些随机数据。

现在这不是您应该使用 RSA 的方式。许多原因,但对您来说最直接的原因是填充/块大小限制了您可以加密的字节数(并且 RSA 太慢,无法考虑循环加密块)。

我写了一篇关于该主题的博客文章,描述了如何将对称(更快的速度,没有大小限制)与非对称加密混合在一起——两全其美 :-)

于 2011-10-28T12:22:02.170 回答