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
с параметром --textmode
вместо sigclass 0x00
без него.
От man gpg
(то же самое для GnuPG 2):
-t, --textmode
--no-textmode
Обрабатывайте входные файлы как текст и сохраняйте их в канонической текстовой форме OpenPGP со стандартными окончаниями строк "CRLF". Это также устанавливает необходимые флаги для информирования получателя о том, что зашифрованные или подписанные данные являются текстовыми, и может потребоваться преобразование концов строк обратно во все, что использует локальная система. Этот параметр полезен при обмене данными между двумя платформами, которые имеют разные соглашения о конце строки (UNIX-подобные для Mac, Mac для Windows и т.д.). --no-textmode
отключает эту опцию и используется по умолчанию.
Если -t
(но не --textmode
) используется вместе с защитой и подписью, это позволяет очищать подписанные сообщения. Этот ключ необходим для совместимости командной строки с версиями PGP для командной строки; обычно вы используете --sign
или --clearsign
чтобы выбрать тип подписи.