如何创建适用于文件的 LF 和 CR/LF 版本的单个 GnuPG 签名?

如何创建适用于文件的 LF 和 CR/LF 版本的单个 GnuPG 签名?

我创建了一个文本文件,每行末尾只使用 LF(换行符)。然后我制作了一个完全相同的版本,只是每行末尾都有 CR/LF(回车符/换行符)。

然后,gpg2我使用 2.0.19 版本为每个文件制作了一个独立的签名。使用正确的签名,每个文件都能正确验证,但当我为每个数据文件使用错误的签名时,验证失败。

到目前为止,这正是我所期望的。

但我手头有一个文本文件及其分离签名。我现在有两个版本的文本文件,一个是 LF 样式,另一个是 CR/LF 样式。相同的分离签名在两个版本上都可以正常工作。

最初的签名者是如何做到这一点的?我希望能够做到这一点。

答案1

总结:设置--textmode选项。

RFC 4880, 5.2.4. 计算签名

5.2.4. 计算签名

所有签名都是通过对签名数据生成哈希值,然后在签名算法中使用生成的哈希值形成的。

对于二进制文档签名(类型0x00),直接对文档数据进行哈希处理。对于文本文档签名(类型0x01),通过将行尾转换为来规范化文档<CR><LF>,然后对生成的数据进行哈希处理。

换句话说,您需要确保 GnuPG 在签名时将文档视为文本文档,这需要使用以下--textmode选项来启用:

gpg --textmode --detach --sign file

通过运行gpg --list-packets signature-file,您将观察到来自 RFC 4880 的不同签名类型,第二行包含sigclass 0x01with --textmodeset 而不是sigclass 0x00without。

来自man gpg(GnuPG 2 也一样):

-t, --textmode
--no-textmode

将输入文件视为文本,并以 OpenPGP 规范文本格式存储它们,并使用标准“CRLF”行尾。这还会设置必要的标志,以通知接收者加密或签名的数据是文本,可能需要将其行尾转换回本地系统使用的行尾。当在具有不同行尾约定的两个平台(类 UNIX 到 Mac、Mac 到 Windows 等)之间进行通信时,此选项很有用。 --no-textmode禁用此选项,并且是默认选项。

如果 -t (但不是--textmode)与保护和签名一起使用,这将启用明文签名消息。此解决方案是与 PGP 的命令行版本兼容所必需的;通常,您会使用--sign--clearsign选择签名的类型。

相关内容