前段时间,我使用gpg
命令行实用程序生成了一个 ed25519 GnuPG (GPG) 密钥对。现在,当我将此密钥导入时gpg
,我收到一条警告:
gpg: key 0123456789ABCDEF: public key "User Name <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: key 0123456789ABCDEF: "User Name <[email protected]>" not changed
gpg: warning: lower 3 bits of the secret key are not cleared
gpg: key 0123456789ABCDEF: secret key imported
gpg: Total number processed: 1
gpg: unchanged: 1
gpg: secret keys read: 1
gpg: secret keys imported: 1
据我随意搜索后了解到,此消息:warning: lower 3 bits of the secret key are not cleared
是由密钥中的潜在漏洞引起的,这可能是因为我使用早期版本的创建了此密钥gpg
。
有没有办法“解决”这种情况,同时保留密钥对?
答案1
对于椭圆曲线密钥使用时,edwards-25519/curve25519
密钥的最低3位应该设置为零,以确保密钥是8的倍数,避免小子群攻击。
您可以以二进制形式编辑密钥,但是这种攻击很难发起,而且概率上也不太可能发生。
编辑:来自 GPG 代码:
将使用正确调整的位生成新密钥,使用未调整位的密钥将发出警告
添加了 CLI 命令 --edit-key [--check-cv25519-bits | --fix-cv25519-bits],允许修复旧密钥
答案2
在我进行了异常大量的深入挖掘之后......
这似乎是一个互操作性问题。除非您“跨越了不同的流”(在 OpenPGP、GnuPG、RNP 之间移动 = 导致在 2.3.3 中添加消息的那个),否则我不会担心它。这只是一个警告,意味着 GnuPG 知道有些不对劲(并希望能够妥善处理??)。
我找不到任何明确的证据来证实这一点,但从我所读到的所有内容来看,这似乎是合理的结论。如果其他人发现更多信息,我欢迎他们确认或纠正我。
这次袭击也并不容易。
血腥细节(胆小者勿看):
“gpg:导入错误的 cv25519 密钥时打印警告。[T5464]”
https://mailarchive.ietf.org/arch/msg/openpgp/-A0CgvBPqWGMw18UBhHE-Gy6LRM/
基本上,libgrypt 与“ed25519”的工作方式与其他算法存在差异(可以将其归类为“勘误表”),并且内部密钥格式和导出的密钥格式之间存在差异(位串的字节序、前导零处理等)。
它似乎只适用于用于加密的“ed25519”,因为用于签名的“cv25519”后来出现了,并且那个时候对于如何做事已经达成了一些一致(这是不同的!)
我曾经偶然发现了对导出的密钥进行十六进制编辑的说明,但我没有将其添加到书签中,并且再也无法找到它。