GnuPG 如何加密密钥?

信息安全 加密 密钥管理 pgp gnupg
2021-08-29 17:05:55

使用 GnuPG 创建密钥时,系统会要求您输入密码来保护它。使用哪种加密算法来实现这一点?手册仅说使用了对称加密算法。

3个回答

GnuPG 2.x 有一个单独gpg-agent的密钥保管人,它无法控制其中的密钥的加密参数。

此外,在设置密码或导出密钥时--s2k接受但被忽略。

错误跟踪器上有一个关于此的问题,当跟进邮件列表时,答案是

不,那是不可能的。现在代理总是使用 AES 和 S2K 参数,这需要在运行的机器上大约 100 毫秒来解密。

所以我相信目前的情况是代理持有密钥,因为代理决定最好在运行的机器上满足其速度目标,并且没有办法控制它或以不同的方式导出。我尝试过的所有导出都会产生您可以看到的关键属性,如下所示:

$ gpg --export-secret-key DEADBEEF | gpg --list-packets
iter+salt S2K, algo: 7, SHA1 protection, hash: 2, salt: ...

这揭示了正在使用的对称密钥 ( algo ) 和散列 ( hash ) 算法,如RFC4880中所定义。上面显示的algo: 7128 位密钥的 AES并且hash: 2SHA-1

iter+salt标记是GnuPG 用来将密码(字符串)转换为密钥的字符串到密钥模式。默认值iter+salt意味着将盐添加到密码短语中,并且该字符串被多次散列(一种称为密钥拉伸的技术,旨在增加暴力破解密码短语的难度)。


这说明了 GnuPG 如何加密密钥,并强调如果您使用的是 2.x 版本,您将无法控制它,因为它使用了gpg-agent.

阶段 1:对称密钥派生

首先,密码短语用于使用字符串到密钥函数导出对称加密的密钥考虑到这一点,可以在 GnuPG 中微调几个设置,例如散列算法和重复次数。来自GnuPG 手册

--s2k-digest-algo name

使用名称作为用于破坏对称加密密码的摘要算法。默认值为 SHA-1。

--s2k-mode n

选择如何修改对称加密的密码。如果 n 为 0,则将使用普通密码(通常不推荐),1 向密码添加盐(不应使用),3(默认)迭代整个过程多次(见 --s2k-count)。

--s2k-count n

指定重复对称加密的密码短语修改的次数。此值的范围可能在 1024 和 65011712 之间(包括 1024 和 65011712)。默认值是从 gpg-agent 查询的。请注意,并非 1024-65011712 范围内的所有值都是合法的,如果选择了非法值,GnuPG 将四舍五入到最接近的合法值。--s2k-mode此选项仅在设置为默认值 3时才有意义。

阶段 2:对称加密

使用此对称密钥,私钥被对称加密。也可以选择加密算法,而 AES-128 是 GnuPG 中的默认值。

--s2k-cipher-algo name

使用 name 作为对称加密的密码算法,如果--personal-cipher-preferences没有--cipher-algo给出密码短语。默认值为 AES-128。

支持的密码可以通过运行显示gpg --version,例如:

$ gpg --version
[...]
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256

与公钥-私钥算法(GnuPG 2.1 添加椭圆曲线)不同,支持的对称算法在所有当前版本的 GnuPG 中都是相同的。

所有这些选项也可以在~/.gnupg/gpg.conf没有--前缀的情况下设置。

根据这篇文章,您可以从以下列表中选择用于数据加密的密码(我假设它包括密钥加密,因为它只是一个文件,对吧?):

密码:3DES、CAST5、BLOWFISH、AES、AES192、AES256、TWOFISH、CAMELLIA128、CAMELLIA192、CAMELLIA256

编辑:

在手册页和谷歌上进行了一些研究之后,您可以通过一些设置更改默认值(有关详细信息,请参阅此问题:如何在 Linux 和 Windows 上更改 GnuPG 中的默认密码?

我找不到任何特别提到私钥加密的内容,所以我假设它只使用设置为默认对称密码的任何内容。