web-dev-qa-db-ja.com

ファイルのLFバージョンとCR / LFバージョンの両方で機能する単一のGnuPG署名を作成するにはどうすればよいですか?

各行の終わりにLF(改行)のみを使用してテキストファイルを作成しました。次に、CR/LF(キャリッジリターン/行)があることを除いて同じバージョンを作成しました。フィード)各行の終わりに。

次に、gpg2バージョン2.0.19を使用して、ファイルごとに分離署名を作成しました。各ファイルは正しい署名で正しく検証されましたが、各データファイルに間違った署名を使用すると失敗しました。

これまでのところ、それは私が期待することです。

しかし、私はテキストファイルとその切り離された署名を持っています。現在、2つのバージョンのテキストファイルがあります。1つはLFスタイル、もう1つはCR/LFスタイルです。同じデタッチされた署名が両方で正しく機能します。

元の署名者はどのようにしてそれを行うことができましたか?それができるようになりたいです。

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とは異なる署名タイプが観察されます。2行目には、sigclass 0x01を設定せずに--textmodeを設定したsigclass 0x00が含まれています。

man gpgから(GnuPG 2でも同じです):

-t, --textmode
--no-textmode

入力ファイルをテキストとして扱い、標準の「CRLF」行末を持つOpenPGP正規テキスト形式で保存します。これにより、暗号化または署名されたデータがテキストであり、行末をローカルシステムが使用するものに変換し直す必要がある場合があることを受信者に通知するために必要なフラグも設定されます。このオプションは、行末の規則が異なる2つのプラットフォーム間で通信する場合に役立ちます(UNIX-Mac、MacからWindowsなど)。 --no-textmodeはこのオプションを無効にし、デフォルトです。

-t--textmodeは除く)を装甲および署名と一緒に使用すると、クリア署名されたメッセージが有効になります。このクラッジは、コマンドラインバージョンのPGPとのコマンドライン互換性のために必要です。通常は、--signまたは--clearsignを使用して署名のタイプを選択します。

3
Jens Erat