Cryptography RSA加密的结果是否保证是随机的

Cryptography RSA加密的结果是否保证是随机的,cryptography,rsa,.net-security,Cryptography,Rsa,.net Security,我使用RSACryptServiceProvider加密一些小数据块。对于我正在研究的解决方案,重要的是,如果使用相同的公钥对同一段源数据加密两次,则结果(加密的数据块)不相同 我已经用一个例子验证了这一点,它像我希望的那样工作。我现在的问题是,如果这种行为是经过设计和保证的,或者我必须在源数据中添加一些随机部分,以保证加密后具有相同数据的数据块不能再匹配 以下是一个例子: byte[] data=new byte[]{1,7,8,3,4,5}; RSACryptoServiceProvider

我使用RSACryptServiceProvider加密一些小数据块。对于我正在研究的解决方案,重要的是,如果使用相同的公钥对同一段源数据加密两次,则结果(加密的数据块)不相同

我已经用一个例子验证了这一点,它像我希望的那样工作。我现在的问题是,如果这种行为是经过设计和保证的,或者我必须在源数据中添加一些随机部分,以保证加密后具有相同数据的数据块不能再匹配

以下是一个例子:

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
(这里
^
是整数幂运算,
mod
是余数运算。)

但正如您所说,这并不能提供良好的安全保证,因为能够猜测明文的攻击者可以通过自己加密并比较结果来验证这种猜测

出于这个原因,官方的RSA规范(以及实践中使用的所有实现)包括一些(部分随机)填充,因此我们实际上不加密
明文
,而是
pad(明文)

解密:

plaintext = unpad( ciphertext ^ decryption-exponent mod modulus )
只有这样,RSA才是真正安全的加密方案


RSA签名也使用类似的填充,以避免容易伪造签名。

教科书RSA加密算法是确定性的:

ciphertext = plaintext ^ encryption-exponent  mod  modulus
(这里
^
是整数幂运算,
mod
是余数运算。)

但正如您所说,这并不能提供良好的安全保证,因为能够猜测明文的攻击者可以通过自己加密并比较结果来验证这种猜测

出于这个原因,官方的RSA规范(以及实践中使用的所有实现)包括一些(部分随机)填充,因此我们实际上不加密
明文
,而是
pad(明文)

解密:

plaintext = unpad( ciphertext ^ decryption-exponent mod modulus )
只有这样,RSA才是真正安全的加密方案


RSA签名也使用了类似的填充,以避免容易伪造签名。

+1感谢您的回答。填充算法是一种常用的算法,还是每个平台都有自己的填充和取消添加逻辑?正如你在回答另一个问题时提到的,基本上有两种填充方案在使用:(完全混合了数据)和(基本上在开始时添加了一些随机字节)。+1感谢你的回答。填充算法是一种常用的算法,还是每个平台都有自己的填充和取消添加逻辑?正如您在回答另一个问题时所提到的,基本上有两种填充方案在使用:(完全混合数据)和(基本上在开始时添加一些随机字节),你不应该直接用RSA加密你的数据——相反,用RSA加密对称密钥,然后用对称密钥加密你的数据。或者更好的办法是,使用现有的库来为您执行此操作。@Nick:谢谢您的评论。我加密一个SHA1散列。我不认为在这种情况下使用混合加密是必要的。相反,我认为这只是无用的开销。我是对的还是我误解了什么?不,这很公平——你实际上是在签名而不是加密。不过,我还是建议使用现有的库,而不是自己编写原语。切题来说,不应该直接使用RSA加密数据,而是使用RSA加密对称密钥,然后使用对称密钥加密数据。或者更好的办法是,使用现有的库来为您执行此操作。@Nick:谢谢您的评论。我加密一个SHA1散列。我不认为在这种情况下使用混合加密是必要的。相反,我认为这只是无用的开销。我是对的还是我误解了什么?不,这很公平——你实际上是在签名而不是加密。不过,我还是建议使用现有的库,而不是自己编写原语。