为什么RSA加密文本会为同一文本提供不同的结果

时间:2013-05-01 19:32:33

标签: unix terminal cryptography openssl rsa

我使用RSA加密使用openSSL加密数据,效果很好。我对RSA的理解是,使用相同的公钥加密相同的数据将始终为您提供相同的结果(as stated herehere)。

但是,使用openssl每次重复加密时都会得到不同的结果。 例如:

➜  ~  echo '30' | openssl rsautl -encrypt -inkey pub.pem -pubin  | shasum
      11b6e058273df1ebe0be5e0596e07a6c51724ca0  -

➜  ~  echo '30' | openssl rsautl -encrypt -inkey pub.pem -pubin  | shasum
      05cb82595f7429ef196189f4e781088597d90eee  -

那么为什么输出不是唯一的?是因为我得到RSA加密错误还是因为openssl做了一些额外的魔术?

实际上我正在尝试设计一个只存储RSA加密数据的数据库。我想对加密信息的哈希值进行搜索,如果加密过程本身不是唯一的,这是不可能的。

2 个答案:

答案 0 :(得分:51)

使用适当的填充方案实现安全RSA加密,其中包括一些随机性。有关详细信息,请参阅PKCS#1OAEP

RSA加密用填充'0'和一串随机位的消息加密。在此过程中,随机字符串通过加密散列和XORing在密文中“隐藏”。在解密时,RSA解密从密文中恢复随机字符串并使用它来恢复消息。这就是为什么你使用openssl rsautl获得相同文本消息的不同结果。

答案 1 :(得分:7)

好的,我明白了。 RSA本身就是确定性的。 但是,为了获得更好的安全性并防止攻击者猜测加密信息,加密不是基于纯“数据”而是基于“数据”+“某些随机模式”(I should have read wikipedia more carefully