web-dev-qa-db-ja.com

コンテンツファイルとその分離署名から署名付きファイルを作成しますか?

filename.txtと呼ぶテキストファイルがあります。まず私は電話します

gpg --output filename.asc --clearsign filename.txt

署名済みファイルfilename.ascが作成されます。次に電話します

gpg --armor --output filename.sig --detach-sign filename.asc

署名は、署名されたファイルfilename.ascから抽出され、filename.sigに保存されます。

私の質問は、元の署名されていないファイルfilename.txtとASCIIで署名されたファイルを作成するための装甲署名filename.sigをどうにかマージできるかどうかです。GPGにそのような機能はありませんが、おそらくわかりませんそれとも、他のツール(Java処理など)で可能ですか?

このファイルをマージすると、署名の検証に失敗します。私の使用例では、ファイルに署名し、署名ファイル(コンテンツなし)で返信する必要があります。その後、個別のsigantureファイルとconentファイルを受け取ります。マージして暗号化する必要があります。今のところ、--detachスイッチを使用しておらず、署名されたファイルを2つのファイルに分割して、それらを単にマージしています。しかし、--detachスイッチを使用すると、sigantureの変更が変更され、sigantureファイルをコンテンツファイルとマージすると機能しません。それは現在の状態を維持することができますが、署名されたファイルを単に分割するのではなく、--detachスイッチを使用して標準的な方法でsigantureを抽出したいのですが、--detachスイッチでエクスポートされたsigantureをマージするオプションが表示されません

3
ctomek

一般に、署名を作成する前に入力を正規化しない限り、分離された署名を単純に取り、それを元のデータと組み合わせてクリア署名メッセージを作成することはできません。

GnuPGは、操作のタイプ(デタッチとクリアサイン)に応じて、元の入力テキストを異なる方法でパックします。 RFC4880セクション7.1は、これに注意しています( http://tools.ietf.org/html/rfc4880#section-7.1 )。

テキストドキュメントのバイナリ署名と同様に、クリアテキスト署名は正規の行末を使用してテキストで計算されます。署名されたテキストを終了する '----- BEGIN PGP SIGNATURE -----'行の前で終わる行(つまり、_<CR><LF>_)は、署名されたテキストの一部とは見なされません。

したがって、最初に入力テキストの行末を正規化し、次にテキストの最後から最後の_<CR><LF>_を削除する必要があります。

以下は、元の入力データを変更する方法の例です。

gpg --armor --output filename.txt.asc --detach-sign <(sed 's/$/\r/' filename.txt | head -c -2)

これは、最初に行末( '_$_')を復帰( '_\r_')に変換した後、切り離された署名(filename.txt.asc)を作成し、復帰を削除します+テキスト入力の最後から改行します。

これで、次のように、署名(filename.txt.asc)と元のファイル(filename.txt)からクリア署名付きメッセージを作成できます。

gpg --verify <(echo -e "-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\n$(cat filename.txt)\n$(cat filename.txt.asc)")

(ハッシュアルゴリズム-私の例では_SHA1_-を実際に使用しているものに置き換える必要があります)

また、注意する必要があります-

_gpg --armor --output filename.sig --detach-sign filename.asc_署名は署名されたファイルfilename.ascから抽出され、filename.sigに保存されます。

これは署名を抽出しません-これは、_filename.asc_ファイル(元の署名を含む)内にデータの新しい署名を作成し、それを_filename.sig_に保存します。 --detach-signの代わりに--clearsignを渡すと、私が何を意味するかがわかります。

2
kylehuff