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