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

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

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

消息是:

嗨爱丽丝!请带上 malacpörkölt 来吃晚餐!

答案1

在里面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,但不直接加密消息)。

答案2

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

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

最后,验证您收到的数据很重要。虽然攻击者可能无法读取传输中的数据,但如果没有对数据流应用完整性或真实性,他可能能够在不被检测到的情况下翻转位。攻击者可以很容易地猜测到端口 443 的 SSL 连接可能是一个以 开头的网页请求GET /,他可以翻转位将其更改为 ,PUT /而不会干扰其余的加密。实现完整性的一种简单方法是在末尾附加 MD5 或 SHA-1 和,但这仅提供数据完整性,而不提供数据真实性。任何对数据流有完整了解的人都可以生成正确的总和,一种更安全的方法是使用像这样的密钥哈希哈马卡这需要知道生成的密钥,从而除了完整性之外还提供数据的真实性。

答案3

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

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

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


如何加密 S/MIME 消息?

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

要获得默认的(尽管相当弱)RC2-40 加密,您只需告诉 openssl 消息和证书所在的位置即可。

openssl smime her-cert.pem -加密 -in my-message.txt

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

openssl smime her-cert.pem -加密 -des3 -in my-message.txt

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

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

如何签署 S/MIME 消息?

如果您不需要加密整个消息,但您确实想对其进行签名,以便收件人可以确保消息的完整性,则方法与加密的方法类似。主要区别在于您需要拥有自己的密钥和证书,因为您无法使用收件人的证书签署任何内容。

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(从http://www.madboa.com/geek/openssl/

(呃...所有这些反斜杠 - 这些应该是转义换行符。不知道发生了什么,因为它在我的编辑框中显示得很好!

相关内容