最近,我需要加密几个大文件。我可以选择使用 OpenSSL 命令行实用程序,但我更喜欢使用 GnuPG。
GnuPG 如何通过该
--encrypt
选项在后台工作?它是先生成对称密钥,然后用公钥加密吗?还是只是非对称加密,对性能很重?如果它首先生成对称密钥,然后使用公钥加密(非对称),它使用什么算法来对称加密数据?
我询问的加密方法(对称+非对称加密)有时被称为“混合加密”或使用“会话密钥”。
我在任何地方都没有找到这样的信息,而且挖掘代码很痛苦。
最近,我需要加密几个大文件。我可以选择使用 OpenSSL 命令行实用程序,但我更喜欢使用 GnuPG。
GnuPG 如何通过该--encrypt
选项在后台工作?它是先生成对称密钥,然后用公钥加密吗?还是只是非对称加密,对性能很重?
如果它首先生成对称密钥,然后使用公钥加密(非对称),它使用什么算法来对称加密数据?
我询问的加密方法(对称+非对称加密)有时被称为“混合加密”或使用“会话密钥”。
我在任何地方都没有找到这样的信息,而且挖掘代码很痛苦。
OpenPGP 始终应用混合加密(无论文件/消息有多小),因此使用对称加密和会话密钥对消息进行加密,会话密钥再次使用一个或多个公钥和非对称加密进行加密(每个收件人一次)。事实上,如果您还添加了密码短语(您可以同时加密组合密码短语和公钥,则可以再次对会话密钥使用对称加密,这样密码短语或匹配的私钥都可以解密消息)。
OpenPGP 消息的(非常简化的)结构或多或少
在 OpenPGP 中加密文件和消息之间没有区别,可能除了没有附加文件名的消息。使用的包和算法完全相同。
讨论使用的算法有点复杂,取决于 GnuPG 的版本、计算机加密的偏好设置以及接收者密钥所有者设置的偏好。确定使用什么的简单方法是 run gpg --list-packets
,它提供了完整的数据包结构(阅读 RFC 4880 有助于理解输出,并且您将了解很多有关 OpenPGP 在幕后工作的知识),通常添加一两个-v
选项就足够了并提供更易于阅读和理解的文本输出。
这就是“混合加密”。
文件格式称为“OpenPGP”,并在RFC 4880中进行了描述。它是一种带有称为“数据包”的子元素的结构。批量数据加密使用对称加密,而对称密钥本身将使用公钥加密会话密钥包中的接收方非对称公钥(RSA、ElGamal...)进行加密。
该方案允许对多个接收者进行有效加密:使用对称密钥对数据进行一次加密,然后使用每个接收者的公钥对该密钥进行加密。