分離された gpg 署名を検証するときに何が起こるかを理解しようとしています。
gnupgからの例ですマニュアル:
blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun 4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <[email protected]>"
gpg はどのようにして署名が適切であると判断するのでしょうか? 署名には署名されたファイルのハッシュが含まれていますか? もしそうなら、署名自体からそのハッシュをどのように抽出するのでしょうか?
試してみましたgpg --list-packets <signature>
が、完全な情報が表示されないようです。
答え1
--list-packets
オプションを使用すると、gpgファイルの内容のダンプを取得できます。ファイル形式の説明は次のとおりです。RFC 4880(OpenPGP 標準)。
署名にはハッシュが直接含まれているわけではありません。ハッシュと送信者の両方を検証できる情報が含まれています。署名検証アルゴリズムはハッシュ値と公開鍵を入力として受け取り、はいまたはいいえ; アルゴリズムははい署名が、与えられた秘密鍵を持つメッセージから、与えられた公開鍵に対応する秘密鍵によって行われた場合、いいえ他のすべての状況(異なるハッシュの署名、異なるキーで作成された署名、または署名になり得ないバイトの束)では、DSSAアルゴリズムでは、秘密鍵を持っていない場合、署名からハッシュを抽出することは不可能だと思います。
署名ファイルには、署名者の ID と署名値が含まれています。署名を検証するために、gpg はキーリングから署名者の公開キーを読み取り、データのハッシュを計算し、署名検証アルゴリズムを適用します。
答え2
$ gpg --list-packets myfile.asc
[...]
digest algo 10, begin of digest 77 dd
これは、使用されたダイジェスト アルゴリズムを示します。残念ながら、man ページにも、gpg --version
どのアルゴリズムがどの ID に割り当てられているかは示されていません。この情報を見つけるには、パケット形式の RFC を調べる必要があります。https://www.rfc-editor.org/rfc/rfc4880#section-9.4
ID Algorithm Text Name
-- --------- ---------
1 - MD5 [HAC] "MD5"
2 - SHA-1 [FIPS180] "SHA1"
3 - RIPE-MD/160 [HAC] "RIPEMD160"
4 - Reserved
5 - Reserved
6 - Reserved
7 - Reserved
8 - SHA256 [FIPS180] "SHA256"
9 - SHA384 [FIPS180] "SHA384"
10 - SHA512 [FIPS180] "SHA512"
11 - SHA224 [FIPS180] "SHA224"
100 to 110 - Private/Experimental algorithm
答え3
はい、デジタル署名は通常、署名者の秘密鍵によって署名された安全なハッシュです。
メッセージ全体に署名するのは非常に時間がかかり、安全性も低くなります。さらに、アルゴリズムはブロックの長さ、パディング(情報をあまり公開しないような方法で)などを考慮する必要があります。
注: 非対称暗号化の場合も、速度上の理由から、一時的な対称キーのみが非対称暗号化され、メッセージの残りの部分は対称暗号化されます。