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

时间:2016-01-30 10:25:16

标签: encryption openssl aes rsa smime

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

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

私钥/公钥的创建方式如下:

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

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

  1. 现在哪一个负责加密?
  2. 哪一个确实影响了性能以及如何影响?
  3. 如果我增加/减少公钥(rsa512 vs rsa4096),这是否会影响性能?

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

    有人可以为这件事带来一些启示吗?

    1. 是否有其他方法可以加密大文件?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

现在剩下的就是连接加密的会话密钥C'和密文C并将它们传输给收件人。在真实的S / MIME消息中,也发送关于发送者公钥的识别信息,以便于签名验证。接收方解析完整的加密消息,使用接收方的私钥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运行此命令,以便将密钥,盐和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

这对您来说更简单(不需要证书/密钥对)和更快(没有RSA加密)。

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

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

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