tl; dr:设置--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 0x01
with --textmode
set而不是with sigclass 0x00
。
从man gpg
(对于GnuPG 2相同):
-t, --textmode
--no-textmode
将输入文件视为文本,并将其存储在带有标准“ CRLF”行尾的OpenPGP规范文本格式中。这还将设置必要的标志,以通知接收者加密或签名的数据是文本,并且可能需要将其行尾转换回本地系统使用的任何内容。在具有不同行尾约定的两个平台之间进行通信时(对于Mac,类似于UNIX,对于Windows,类似于Mac,等等),此选项很有用。 --no-textmode
禁用此选项,并且是默认选项。
如果将 -t
(但不使用--textmode
)与铠装和签名一起使用,则启用清除签名的消息。为了使命令行与PGP的命令行版本兼容,需要使用此合并。通常,您将使用--sign
或
--clearsign
选择签名的类型。