使用公钥解密 - openssl/RSA

13

我正在寻求保护运行Linux的小型设备的软件更新过程的安全措施。我希望在发送更新包之前生成更新包内容的md5校验和,然后使用私钥加密该哈希值。当客户加载更新包时,设备应解密哈希值、验证它并继续安装更新包。

我尝试使用OpenSSL和RSA实现此操作。我发现这个线程,但感到沮丧。接着我发现了这个线程,并想知道Perl是如何绕过所有这些所谓的不可能的问题的。我正在使用C语言进行开发,因此也许SSL库中有类似函数可以使用?

所以我的问题真正是:我能否强制命令行Linux将公钥作为解密输入,或者使用C语言来规避该限制?

提前感谢您的帮助。


2
旁注:您使用公钥进行加密,使用私钥进行解密。您还可以使用私钥签名(对于RSA来说,与解密相同),并使用公钥验证(对于RSA来说,与加密相同)。 - Duncan Jones
谢谢。您的评论帮助澄清了答案。此外,当我运行答案中的命令(签名和验证)时,签名的输出看起来像是加密过的,而验证的输出则是明文。不幸的是,我不理解您所说的工作原理。如何让解密(签名)看起来像乱码,而加密(验证)看起来干净? - pdm
3
RSA加密和解密是彼此的逆运算。它们可以以任何顺序运行。因此,对于一条消息M加密(解密(M)) = M解密(加密(M)) = M - Duncan Jones
当然。所以我认为RSA中的词汇选择更多地是指示哪些密钥用于什么,而不是指示输出的外观。再次感谢。 - pdm
2个回答

19

假设您使用openssl genrsa生成了公钥和私钥:

$ 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

这是您在寻找的内容吗?


这正是我所寻找的,谢谢。尽管如我在上面的帖子中所评论的那样,我不确定它是如何工作/为什么词汇不同等等。但它确实做到了我想要的,所以谢谢。 - pdm
3
现在,您正在对md5sum的文本输出进行签名,而不是直接对“myfile”进行签名/验证。警告:在这里使用MD5或512位RSA密钥当然是完全不安全的。 - Maarten Bodewes

0

注意:我建议您使用签名和验证例程,而不是尝试使用底层的RSA加密和解密例程自己实现它们。

尽管如此,Openssl CLI可以通过rsautl子命令实现“使用公钥解密”:

openssl rsautl -verify -inkey public_key.pem -pubin -in data.sig -raw -hexdump

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接