Как создать одну подпись GnuPG, которая работает как с LF, так и с CR/LF версиями файла?

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

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

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам