为啥 RSA 加密文本给我相同文本的不同结果
Posted
技术标签:
【中文标题】为啥 RSA 加密文本给我相同文本的不同结果【英文标题】:Why does RSA encrypted text give me different results for the same text为什么 RSA 加密文本给我相同文本的不同结果 【发布时间】:2013-04-25 20:36:39 【问题描述】:我正在使用 RSA 加密使用 openSSL 加密数据,效果很好。我对 RSA 的理解是,用相同的公钥加密相同的数据总是会给你相同的结果(as stated here 或here)。
但是,使用 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 加密数据的数据库。我想对加密信息的哈希和进行搜索,如果加密过程本身不是唯一的,这是不可能的。
【问题讨论】:
FWIW,rsautil 被贬低以支持pkeyutil 【参考方案1】:安全的 RSA 加密是通过适当的填充方案实现的,其中包括一些随机性。有关详细信息,请参阅 PKCS#1 或 OAEP。
RSA 加密对用'0' 和一串随机位填充的消息进行加密。在此过程中,随机字符串通过密码散列和异或运算“隐藏”在密文中。在解密时,RSA 解密从密文中恢复随机字符串并使用它来恢复消息。这就是为什么你使用 openssl rsautl 得到不同结果的原因。
【讨论】:
【参考方案2】:好的,我明白了。 RSA 本身是确定性的。 但是,为了获得更好的安全性并防止攻击者猜测加密信息,加密不是在纯“数据”上进行,而是在“数据”+“some-random-pattern”上进行(I should have read wikipedia more carefully)
【讨论】:
这不仅仅是猜测加密信息。即使信息是不可猜测的(比如 128 位密钥),不使用适当的填充方案也会导致严重的弱点。即使是仍然流行的 PKCS#1 v1.5 方案也很弱。以上是关于为啥 RSA 加密文本给我相同文本的不同结果的主要内容,如果未能解决你的问题,请参考以下文章