我需要使用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();
我猜测该类必须使用其他东西以及影响输出的键,但是我一直在努力找出原因。
最佳答案
每次对相同的明文进行加密时,密文都不同,这并不意味着无法一致地对其进行解密。
确实,这是一个好的密码算法的标志,它能够具有这种行为,从而使其对各种攻击更具弹性。
这是因为加密逻辑在过程中引入了随机性,例如通过在明文本身之前系统地添加一些随机字节。只要在解密整个密文后解密逻辑知道忽略这些字节,它就可以重现原始的明文。
我建议您使用此b64文本的任何实例,将其提交给反向过程,并查看生成的“ rgb”在所有情况下均为“ Hello world”。