unix - 为什么 RSA 加密文本对相同的文本给出不同的结果

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

最佳答案

安全的 RSA 加密是通过适当的填充方案实现的,其中包括一些随机性。请参阅PKCS#1OAEP了解更多详情。

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

关于unix - 为什么 RSA 加密文本对相同的文本给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16325057/

相关文章:

linux - 从 crontab 运行 git - 权限被拒绝

java - 如何解密密文分区 - AES、Java

java - 给定用于修改字符串的方法,如何将修改后的字符串反转回 MD5 哈希?

java - 加密安全 PRNG(伪随机数生成器)

Mysql:选择今天起的所有订单(转换unix时间戳)

c++ - TCP 服务器 C++/Unix 命令行

linux - Bash 脚本检查远程运行命令的权限

git - 安装github后,尝试创建提交时出错

linux - 如何在 Linux 中使用 D 编程语言取消缓冲输入?

macos - Mac终端发送带附件的邮件