使用 GnuPG 创建密钥时,系统会要求您输入密码来保护它。使用哪种加密算法来实现这一点?该手册仅说使用了对称加密算法。
GnuPG 如何加密密钥?
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: 7
是128 位密钥的 AES并且hash: 2
是SHA-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 中的默认密码?)
我找不到任何特别提到私钥加密的内容,所以我假设它只使用设置为默认对称密码的任何内容。