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