【问题标题】:openssl/RSA - Using a Public key to decryptopenssl/RSA - 使用公钥解密
【发布时间】:2013-01-14 21:58:43
【问题描述】:

我正在为我正在维护的运行 Linux 的小型设备确保软件更新过程的安全。我想生成更新包内容的 md5sum,然后用私钥加密该散列,然后再将其发送给客户。当他们加载更新时,设备应该解密哈希,验证它,然后继续安装包。

我正在尝试使用 OpenSSL 和 RSA 来做到这一点。我找到了this 线程,很沮丧。然后我找到了this 线程,想知道 Perl 是如何解决所谓的不可能的问题的。我在 C 语言中执行此操作,所以 SSL 库中的某个地方可能有一个并行函数?

所以我的问题真的是:我可以强制命令行 Linux 将公钥作为解密输入,还是使用 C 来规避这个限制?

提前谢谢大家。

【问题讨论】:

  • 旁注:您使用公钥加密并使用私钥密钥解密。您还可以使用私钥(对于 RSA,与解密相同)签名并使用公钥(对于 RSA,与加密相同)进行验证。
  • 谢谢。您的评论有助于澄清答案。此外,当我在答案(签名和验证)中运行命令时,签名的输出看起来是加密的,而验证的输出是纯文本。不幸的是,我不明白你所说的如何运作。为什么解密(签名)看起来像乱码,而加密(验证)看起来干净?
  • RSA 加密和解密是相反的。它们可以按任何顺序运行。因此,对于消息,MEncrypt(Decrypt(M)) == MDecrypt(Encrypt(M)) == M
  • 哦,当然。所以我认为 RSA 中的词汇选择实际上更多的是指示哪些密钥用于什么,而不是指示输出的外观。再次感谢。

标签: linux openssl rsa


【解决方案1】:

假设您使用openssl genrsa 生成了一个公共和私有 RSA 密钥:

$ openssl genrsa -out mykey
Generating RSA private key, 512 bit long modulus
...++++++++++++
..........++++++++++++
e is 65537 (0x10001)
$ openssl rsa -in mykey -pubout -out mykey.pub
writing RSA key

你可以像这样用私钥签署一些东西:

$ md5sum myfile | openssl rsautl -inkey mykey -sign > checksum.signed

您可以使用公钥验证此数据:

$ openssl rsautl -inkey mykey.pub -pubin -in checksum.signed
df713741d8e92b15977ccd6e019730a5  myfile

这就是你要找的吗?

【讨论】:

  • 这正是我想要的,谢谢。不过,正如我对上述帖子的评论所表明的那样,我不确定这是如何工作的/为什么词汇不同等等。不过,它确实可以做到我想要的,所以谢谢。
  • 您现在正在签署 md5sum 的文本输出,而不是直接签署/验证“myfile”。 警告在这里使用 MD5 或 512 位 RSA 密钥当然是完全不安全的。