如何使用RSA和OpenSSL加密消息/文本?


29

我有爱丽丝的公钥。我想向Alice发送RSA加密消息。如何使用openssl命令来做到这一点?

消息是:

嗨,爱丽丝!请带晚饭吃!

Answers:


36

openssl手册openssl手册页)中,搜索RSA,您将看到RSA加密的命令是rsautl。然后阅读rsautl手册页以查看其语法。

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

默认的填充方案是原始的PKCS#1 v1.5(仍在许多协议中使用)。openssl还支持OAEP(现在推荐)和原始加密(仅在特殊情况下有用)。

请注意,直接使用openssl通常是一种练习。实际上,您将使用gpg之类的工具(该工具使用RSA,但不直接加密消息)。


使用有什么问题openssl
Bratchley

2
@Bratchley openssl命令行工具是不同命令的混合。一些证书(大多数是操纵证书的证书)可能有用,但由于其语法和参数古怪,因此很难正确使用。某些工具(例如rsautl)很好,但不提供有用的功能,它们只是公开原始的加密原语,例如RSA加密几乎只用于加密对称密钥以进行混合加密。像这样的某些工具enc很难安全使用,如果不存在,世界会变得更好。
吉尔(Gilles)'所以

好答案。我添加了带有该标志的填充-oaep然后在解密时,指定相同的内容... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet

24

首先,如果您只想进行良好的加密,则应查看GnuPG。但是,如果您进行实验并且只想了解其工作原理,则需要了解RSA是什么。RSA并非旨在加密任意字符串,而是一种对整数进行加密的算法。具体来说,是0到n-1之间的整数,其中n是来自公共密钥的模数值。当您谈论一个1024位的RSA密钥时,这意味着需要1024位将模数存储在二进制文件中。这是原因之一,RSA与对称密钥密码(如DESAES)结合使用。您可以为AES生成一个随机的256位密钥,并使用1024位RSA公共密钥对该密钥进行加密。然后,任何访问私钥的人都可以提取对称密钥并使用AES解码消息。RSA的完整标准称为PKCS#1

此外,DES和AES是分组密码。它们仅以特定大小的块加密数据。DES使用64位块,而AES使用128位块。要加密多个块,您必须使用CBC或CTR之类的操作模式。这些模式指定如何使用块模式密码对位流进行加密。

最后,确认您收到的数据很重要。尽管攻击者可能无法读取传输中的数据,但如果没有完整性或真实性应用于数据流,则攻击者可以翻转位而不进行检测。攻击者可以轻易地猜到与端口443的SSL连接可能是一个始于此的网页请求GET /,他可以翻转位将其更改为PUT /而不干扰其余的加密。一种简单的完整性方法是在末尾附加MD5或SHA-1总数,但这仅提供数据完整性,而不提供数据真实性。任何完全了解数据流的人都可以生成正确的总和,一种更安全的方法是使用像HMAC这样的键哈希 这需要知识的秘密才能生成,从而提供完整性以外的数据真实性。


2
这真的很好
mko

5

在下面,请注意,您可以指定所需的任何算法,无论是列出的算法还是RSA(尽管我不知道OpenSSL用于RSA的确切名称)

使用“ openssl enc -help”获取系统上支持的密码列表,并将其作为参数传递。例如,“-aes256”

请注意,在我的系统上,我的选项中没有RSA-至少使用该名称。


如何加密S / MIME消息?

假设某人向您发送了她的公共证书,并要求您对她加密一些消息。您已将她的证书另存为her-cert.pem。您已将回复另存为my-message.txt。

要获得默认(尽管相当弱)的RC2-40加密,只需告诉openssl消息和证书位于何处。

openssl smime her-cert.pem -encrypt-在my-message.txt中

如果您确定远程通讯员具有可靠的SSL工具包,则可以指定更强大的加密算法,例如三重DES:

openssl smime her-cert.pem -encrypt -des3-在my-message.txt中

默认情况下,加密的消息(包括邮件头)被发送到标准输出。使用-out选项或您的Shell将其重定向到文件。或者,更棘手的是,将输出直接传递到sendmail。

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My encrypted reply' |\
 sendmail her@heraddress.com

如何签名S / MIME消息?

如果您不需要对整个邮件进行加密,但您确实希望对其进行签名,以确保收件人可以确定邮件的完整性,则该方法与加密方法相似。主要区别在于您需要拥有自己的密钥和证书,因为您无法使用收件人的证书进行任何签名。

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My signed reply' |\
 sendmail her@heraddress.com

(来自http://www.madboa.com/geek/openssl/

(er ...所有这些反斜杠-应该反斜杠转义。不知道发生了什么,因为它在我的编辑框中可以正常显示!


1
您需要在每行的开头放置四个空格以保留换行符。我更改了第一个方框以向您展示如何操作。你能解决第二个问题吗?
Mikel

1
您没有找到RSA,openssl enc因为enc它仅用于对称加密。是的,openssl的选项组织得不太好。非对称算法有其自己的命令:rsa/ dsa/ dh操纵密钥,rsautl/ dsautl加密/解密/验证/签名,和genrsa/ gendsa/ gendh生成密钥。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.