53

我正在使用 RSA 加密使用 openSSL 加密数据,效果很好。我对 RSA 的理解是,用相同的公钥加密相同的数据总是会给你相同的结果(如此处此处所述)。

但是,使用 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 加密数据的数据库。我想对加密信息的哈希和进行搜索,如果加密过程本身不是唯一的,这是不可能的。

4

2 回答 2

75

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

RSA 加密加密用 '0' 和一串随机位填充的消息。在此过程中,随机字符串通过密码散列和异或运算“隐藏”在密文中。在解密时,RSA 解密从密文中恢复随机字符串并使用它来恢复消息。这就是为什么您使用 openssl rsautl 对同一条短信获得不同结果的原因。

于 2013-05-02T02:23:21.823 回答
15

好,我知道了。RSA 本身是确定性的。但是,为了获得更好的安全性并防止攻击者猜测加密信息,加密不是在纯“数据”上进行,而是在“数据”+“一些随机模式”上进行(我应该更仔细地阅读维基百科

于 2013-05-01T19:57:03.053 回答