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

Lan*_*nes 32 encryption openssl

我有爱丽丝的公钥。我想向 Alice 发送 RSA 加密消息。我该如何使用openssl命令?

消息是:

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

Gil*_*il' 44

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
Run Code Online (Sandbox Code Playgroud)

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

请注意,直接使用 openssl 主要是一种练习。在实践中,您会使用诸如gpg 之类的工具(它使用 RSA,但不直接加密消息)。

  • @Bratchley `openssl` 命令行工具是不同命令的混合。一些,主要是操纵证书的那些,可能很有用,但很难正确使用,因为它们的语法和参数很古怪。有些,比如 rsautl,很好,但不提供有用的功能,它们只是公开原始密码原语——例如 RSA 加密几乎只用于加密混合加密的对称密钥。有些,比如 `enc`,很难安全地使用,如果它们不存在,世界会变得更好。 (4认同)

pen*_*359 27

首先,如果你只是想要好的加密,你应该看看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这样的密钥散列 这需要知道密钥才能生成,从而除了完整性之外还提供数据真实性。

  • 这真的很好 (3认同)

dra*_*ath 6

在下面,请注意您可以指定您想要的任何算法,无论是列出的算法还是 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 -in my-message.txt

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

openssl smime her-cert.pem -encrypt -des3 -in 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
Run Code Online (Sandbox Code Playgroud)

如何签署 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您没有在 `openssl enc` 中找到 RSA,因为 `enc` 仅用于对称加密。是的,openssl 的选项组织得不是很好。非对称算法有自己的命令:`rsa`/`dsa`/`dh` 用于操作密钥,`rsautl`/`dsautl` 用于加密/解密/验证/签名,以及`genrsa`/`gendsa`/`gendh`生成密钥。 (2认同)