我创建了一个文本文件,每行末尾只使用 LF(换行符)。然后我制作了一个完全相同的版本,只是每行末尾都有 CR/LF(回车符/换行符)。
然后,gpg2
我使用 2.0.19 版本为每个文件制作了一个独立的签名。使用正确的签名,每个文件都能正确验证,但当我为每个数据文件使用错误的签名时,验证失败。
到目前为止,这正是我所期望的。
但我手头有一个文本文件及其分离签名。我现在有两个版本的文本文件,一个是 LF 样式,另一个是 CR/LF 样式。相同的分离签名在两个版本上都可以正常工作。
最初的签名者是如何做到这一点的?我希望能够做到这一点。
答案1
总结:设置--textmode
选项。
5.2.4. 计算签名
所有签名都是通过对签名数据生成哈希值,然后在签名算法中使用生成的哈希值形成的。
对于二进制文档签名(类型
0x00
),直接对文档数据进行哈希处理。对于文本文档签名(类型0x01
),通过将行尾转换为来规范化文档<CR><LF>
,然后对生成的数据进行哈希处理。
换句话说,您需要确保 GnuPG 在签名时将文档视为文本文档,这需要使用以下--textmode
选项来启用:
gpg --textmode --detach --sign file
通过运行gpg --list-packets signature-file
,您将观察到来自 RFC 4880 的不同签名类型,第二行包含sigclass 0x01
with --textmode
set 而不是sigclass 0x00
without。
来自man gpg
(GnuPG 2 也一样):
-t, --textmode
--no-textmode
将输入文件视为文本,并以 OpenPGP 规范文本格式存储它们,并使用标准“CRLF”行尾。这还会设置必要的标志,以通知接收者加密或签名的数据是文本,可能需要将其行尾转换回本地系统使用的行尾。当在具有不同行尾约定的两个平台(类 UNIX 到 Mac、Mac 到 Windows 等)之间进行通信时,此选项很有用。
--no-textmode
禁用此选项,并且是默认选项。
如果
-t
(但不是--textmode
)与保护和签名一起使用,这将启用明文签名消息。此解决方案是与 PGP 的命令行版本兼容所必需的;通常,您会使用--sign
或--clearsign
选择签名的类型。