当我想加密大文件时,我找到了以下命令:
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
- 键。
如果我增加/减少公钥(rsa512 vs rsa4096),这是否会影响性能?
如果我选择不同的aes
算法,这是否也会影响性能?
有人可以为这件事带来一些启示吗?
答案 0 :(得分:3)
使用openssl smime
命令对数据进行加密,以便收件人using email可以接收和解密数据。这意味着它使用代表各种实体(发件人,收件人)的证书,并包含与这些实体唯一关联的密钥,以对包含的数据进行签名,加密,解密和验证签名。
正如Artjom在评论中指出的那样,使用了混合密码系统。这意味着使用symmetric和asymmetric加密算法的组合,因为每种算法都有其优点和缺点。与非对称加密(例如RSA)相比,对称加密(例如AES)非常快。但是,AES / CBC仅提供机密性,而不是完整性,身份验证或不可否认性。非对称加密可以提供完整性,身份验证和不可否认性。非对称加密对其可以加密的数据量也有相当低的限制(例如,RSA-4096位密钥一次最多可以加密446个字节)。通过结合这两种方法,我们可以锻炼每种方法,并减轻对方的弱点。
在这种情况下,请将消息设为M
。生成长度为256位的AES / CBC密钥Kaes
并用于加密原始数据,使得密文C
为C = E(Kaes, M)
。然后,使用收件人的公钥Krpub
将Kaes
加密为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
从环境变量,文件或文件描述符中读取。
更新以明确解决原始问题: