2

Я создал текстовый файл, используя только LF (перевод строки) в конце каждой строки. Затем я сделал его версию, которая была идентична, за исключением того, что в конце каждой строки был CR/LF (возврат каретки / перевод строки).

Затем, используя gpg2 версии 2.0.19, я сделал отдельную подпись для каждого файла. Каждый файл проверен правильно с правильной подписью, но не смог сделать это, когда я использовал неправильную подпись для каждого файла данных.

Пока что это то, что я ожидал.

Но у меня есть текстовый файл и отдельная подпись. Теперь у меня есть две версии текстового файла: одна в стиле LF, другая в стиле CR/LF. Одна и та же отдельная подпись работает правильно на обоих.

Как оригинальному подписчику удалось это сделать? Я хотел бы быть в состоянии сделать это.

1 ответ1

2

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 чтобы выбрать тип подписи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .