我使用 RSACryptoServiceProvider 来加密一些小数据块。对于我正在研究的解决方案,重要的是,如果使用相同的公钥对同一段源数据加密两次,则结果(加密的数据块)不相同。
我已经用一个例子对此进行了检查,它的效果正如我所希望的那样。我现在的问题是,这种行为是否是设计使然并得到保证的,或者我是否必须在源数据中添加一些随机部分以保证具有相同数据的数据块在加密后不再匹配。
这是示例:
byte[] data=new byte[]{1,7,8,3,4,5};
RSACryptoServiceProvider encrypter = cert.PublicKey.Key as RSACryptoServiceProvider;
byte[] encryptedData = encrypter.Encrypt(data,true);
// encryptedData has always other values in, although the source data is always
// 1,7,8,3,4,5 and the certificate is always the same (loaded from disk)
具体问题是针对 .net 的,但如果是设计使然的话,也许可以为所有 RSA 实现给出一般性的答案?
教科书上的RSA加密算法是确定性的:
ciphertext = plaintext ^ encryption-exponent mod modulus
(Here ^
是整数幂,mod
求余运算。)
但正如您所说,这并不能提供良好的安全保证,因为可以猜测明文的攻击者可以通过自己加密并比较结果来简单地验证此猜测。
因此,官方 RSA 规范(以及实践中使用的所有实现)包含一些(部分随机)填充,因此我们实际上并不加密plaintext
, but pad(plaintext)
:
ciphertext = pad(plaintext) ^ encryption-exponent mod modulus
解密:
plaintext = unpad( ciphertext ^ decryption-exponent mod modulus )
只有这样的填充,RSA才是真正的安全加密方案。
类似的填充也用于 RSA 签名,以避免轻易伪造签名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)