openssl smime:aes vs rsa - 哪个加密?

openssl smime: aes vs rsa - which one encrypts?

当我想加密大文件时,我发现了以下命令:

openssl smime -encrypt -binary -aes-256-cbc \
-in large_file.img -out large_file.img.dat \
-outform DER \
public-rsa2048.pem

private/public 键是这样创建的:

openssl req -x509 -nodes -newkey rsa:2048 \
-keyout private-rsa2048.pem -out public-rsa2048.pem

所以我正在使用 aes-256-cbs 以及 rsa 键。

  1. 现在由谁负责加密?
  2. 哪一个会影响性能以及如何影响?

如果我 increase/lower public 密钥(rsa512 vs rsa4096),这会影响性能吗?

如果我选择不同的 aes 算法,这是否也会影响性能?

有人可以解释一下这件事吗?

  1. 还有其他加密大文件的方法吗?

使用 openssl smime 命令加密数据以一种可以由收件人 using email 接收和解密的方式加密数据。这意味着它使用代表各种实体(发件人、收件人)并包含与这些实体唯一关联的密钥的证书来对所包含的数据进行签名、加密、解密和验证签名。

正如 Artjom 在他们的评论中指出的那样,使用了混合密码系统。这意味着使用了 symmetric and asymmetric 加密算法的组合,因为每个算法都有优点和缺点。与非对称加密(如 RSA)相比,对称加密(如 AES)速度极快。但是,AES/CBC 仅提供机密性,不提供完整性、身份验证或不可否认性。非对称加密可以提供完整性、身份验证和不可否认性。非对称加密对其可以加密的数据量也有相当低的限制(例如,RSA-4096 位密钥一次最多可以加密 446 个字节)。通过结合这两种方法,我们可以发挥各自的长处并减轻对方的弱点。

在这种情况下,让我们的消息为 M。生成一个长度为 256 位的 AES/CBC 密钥 Kaes 并用于加密原始数据,使得密文 CC = E(Kaes, M)。然后使用收件人的 public 密钥 KrpubKaes 加密为 C' = E(Krpub, Kaes)。加密这种少量数据的成本相对较低,即使我们使用的是昂贵的操作。

注意 在加密临时会话密钥之前,可能会使用发件人的私钥 Kspriv 对其进行签名,除非禁用数字签名。我不是 100% 确定 S/MIME,但这就是 PGP 的工作方式,因为当发送给多个收件人时,使用 n 收件人的 public 加密会话密钥会更昂贵密钥,然后使用发送者的私钥 O(2n)O(n+1) 对每个加密密钥进行签名(不是真正的 Big-O 表示法,但对于传达要点很有效)。无论接收者如何,会话密钥的签名都是相同的,因为它只取决于发送者的私钥。

现在剩下的就是将加密的会话密钥 C' 和密文 C 连接起来,然后将它们发送给接收者。在真实的 S/MIME 消息中,发送者的 public 密钥的识别信息也会被传输,以便于签名验证。收件人解析完整的加密消息,使用收件人的私钥 Krpriv 解密会话密钥,然后使用会话密钥 Kaes 解密密文 C

但是,对于您的情况来说,所有这些似乎都有些过分了。如果您不需要与电子邮件通信系统集成,只是想加密大文件进行存储,openssl 还提供了一个简单的 enc 命令。您可以按如下方式使用它:

基于密码的加密: $ openssl enc -aes-256-cbc -in large_plain_file.dmg -out large_encrypted_file.enc -k thisIsABadPassword

-k 允许您在命令行中输入密码,密钥将从中导出。 OpenSSL 使用确定性密钥派生函数 (KDF)(有效 key, iv = MD5(password||salt))。您可以 运行 此命令的末尾带有 -p 以将密钥、salt 和 IV 打印到控制台。 IV 是确定性地从密码和盐派生的。推荐使用像 PBKDF2 这样的 KDF,但 OpenSSL 中的库函数出于某种原因不会将其暴露给命令行工具。

警告 你可以 运行 并指定 -nosalt 跳过盐生成,但不推荐这样做,因为它会使 KDF 已经非常弱甚至更弱。

密钥加密: $ openssl enc -aes-256-cbc -in large_plain_file.dmg -out large_encrypted_file.enc K 0123456789ABCDEFFEDCBA98765432100123456789ABCDEFFEDCBA9876543210 -IV 0123456789ABCDEFFEDCBA9876543210

运行 提供的实际密钥和 IV。密钥为 32 字节(256 位),IV 为 16 字节(一个 AES 块的大小)。

要解密数据,运行带有-d标志的命令:

$openssl enc -aes-256-cbc -d -in large_encrypted_file.dmg -out large_decrypted_file.enc

这对您来说会更简单(不需要 certificates/key 对)并且更快(不需要 RSA 加密)。

对于所有这一切要记住的一点是,如果您在命令调用中提供 password/key 将保留在终端历史记录中 。 运行out -k-K 将在安全提示中提示输入密码。或者使用 -pass 从环境变量、文件或文件描述符中读取。


更新以明确解决原始问题:

  1. AES 密钥负责加密数据。 RSA 密钥用于加密 AES 密钥。
  2. 两者都会影响性能。 AES 密钥加密的数据更多,但比 RSA 加密快得多。
    • 是的,更改 RSA 密钥的大小会影响性能(密钥越大越慢),但对于大文件,这不太可能成为性能的限制因素。
    • 是的,更改 AES 操作模式可能会对性能产生重大影响。 AES/CBC、AES/OFB和AES/CFB的相似之处在于它们是串行操作(取决于一个块操作的结果进行下一个),但AES/CTR操作为流密码,可以并行化以提供加密和解密。
  3. 见上面的答案。