【问题标题】:Is the result of a RSA encryption guaranteed to be randomRSA 加密的结果是否保证是随机的
【发布时间】:2011-10-28 16:27:39
【问题描述】:

我使用 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 加密您的数据 - 而是使用 RSA 加密对称密钥,并使用对称密钥加密您的数据。或者更好的是,使用为您执行此操作的现有库。
  • @Nick:感谢您的评论。我加密了一个 SHA1 哈希。我认为在这种情况下不需要使用混合加密。相反,我认为这只是无用的开销。我是对的还是我误解了什么?
  • 不,这很公平 - 您实际上是在签名而不是加密。不过,我仍然建议使用现有的库而不是自己编写原语。

标签: cryptography rsa .net-security


【解决方案1】:

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

ciphertext = plaintext ^ encryption-exponent  mod  modulus

(这里^是整数取幂,mod是余数运算。)

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

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

ciphertext = pad(plaintext) ^ encryption-exponent  mod  modulus

解密:

plaintext = unpad( ciphertext ^ decryption-exponent mod modulus )

只有使用这种填充,RSA 才是真正安全的加密方案。

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

【讨论】:

  • +1 感谢您的回答。 padding算法是常用的算法,还是每个平台都实现了自己的padding和unpadding逻辑?
  • 正如在回答您的另一个问题时提到的,基本上使用了两种填充方案:OAEP(完全混合数据)和PKCS1-v1_5(基本上添加了一些随机字节开头)。
猜你喜欢
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2019-12-08
  • 1970-01-01
相关资源
最近更新 更多