Gpg2シグネチャにはどのような情報が含まれていますか?
空のファイルにclearsignを付けると、署名は次のようになります。
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
jQIcBAEBCAAGBJaPoTMAoJEMEJof2E4sLl4hgP/355iZSmAWcgF8ADUMcL85Wa
...
KyugtYr0DewOPPA83kd7BCBpi1Cen9ltAJfK47RVsPPKqlxn+yNUt+YOBpYdNC
mKhDc/j156f4S1vxB/LI
=wkGU
-----END PGP SIGNATURE-----
たとえば、S/MIMEの場合、
$openssl enc -base64 -d < signature > signature.dec
そして
$der2ascii -i signature.dec
より多くの情報を出力します。どのようにしてgpg-signaturesと同等のものを実行できますか?
ここに例があります。
キーを作成します。
gpg --full-gen-key
...
pub rsa3072 2017-12-23 [SC]
9727B646039D8D463EE2394531EA459B1AA5A792
uid tester (Delete Me) <tester@tester>
sub rsa3072 2017-12-23 [E]
空のファイルを作成します。
touch empty
切り離された署名を作成します。
gpg --detach-sign --default-key 9727B646039D8D463EE2394531EA459B1AA5A792 empty
gpg: using "9727B646039D8D463EE2394531EA459B1AA5A792" as default secret key for signing
署名を調べる:
gpg --list-packets empty.sig
# off=0 ctb=89 tag=2 hlen=3 plen=435
:signature packet: algo 1, keyid 31EA459B1AA5A792
version 4, created 1514055133, md5len 0, sigclass 0x00 digest algo 10, begin of digest 05 74
hashed subpkt 33 len 21 (issuer fpr v4 9727B646039D8D463EE2394531EA459B1AA5A792)
hashed subpkt 2 len 4 (sig created 2017-12-23)
subpkt 16 len 8 (issuer key ID 31EA459B1AA5A792)
data: [3072 bits]
UPDATE:
メッセージダイジェストはどこにありますか?
--list-packets
の出力からわかるように、私の例では、メッセージダイジェストはアルゴリズム10であり、05 74の16進バイトパターンで始まります。 RFC488 セクション9.4によると、アルゴリズム10 SHA-512です。
この部分では、署名パケットの16進数表現を調べる必要があります。
00000000: 89 01 b3 04 00 01 0a 00 1d 16 21 04 97 27 b6 46 ..........!..'.F
00000010: 03 9d 8d 46 3e e2 39 45 31 ea 45 9b 1a a5 a7 92 ...F>.9E1.E.....
00000020: 05 02 5a 3e a5 dd 00 0a 09 10 31 ea 45 9b 1a a5 ..Z>......1.E...
*00000030: a7 92 05 74 0c 00 a7 b5 50 c7 26 98 b9 48 7c df ...t....P.&..H|.*
00000040: 68 e4 8e 4f 07 82 5a 5f 78 a1 c6 30 93 05 9b dd h..O..Z_x..0....
00000050: aa 36 ec 89 72 20 4f 06 75 6e 1b 89 ff 2c 2b d5 .6..r O.un...,+.
00000060: 1a af 73 82 a6 e0 85 50 be 59 8a 05 13 d7 ca 2c ..s....P.Y.....,
00000070: cd 61 f0 f1 52 c5 47 c2 f9 f0 cd 69 a9 8c 54 8e .a..R.G....i..T.
00000080: 79 a6 82 b2 1b 15 c0 cf 96 0a c7 88 a9 6e 54 31 y............nT1
00000090: 3d e0 96 62 14 94 6e aa 6b 7d c4 9c 4b c1 14 c8 =..b..n.k}..K...
000000a0: bb ce ce 22 44 9c 3b df 64 cd ad f5 71 80 e0 d0 ..."D.;.d...q...
000000b0: 63 71 00 df 74 8e cd 82 bc 94 46 26 42 97 85 af cq..t.....F&B...
000000c0: 84 ea e7 e7 39 2d 45 70 f0 8e 42 65 a2 57 2b ca ....9-Ep..Be.W+.
000000d0: 75 95 e1 7e cd 2d ab c0 a5 7f 7a 8a e1 e7 7a 65 u..~.-....z...ze
000000e0: d2 b1 83 46 e0 0a b3 ac 83 66 f9 45 2a a5 b0 7c ...F.....f.E*..|
000000f0: 8a 64 d7 28 30 68 ee 2f 8f 3a 1c 1e b9 09 ca 92 .d.(0h./.:......
00000100: 27 85 6e 11 da 0a a0 1d 99 b5 e5 04 66 cf 2d 0b '.n.........f.-.
00000110: 22 57 5d ab 56 70 75 28 81 06 a9 ba 06 92 8d 89 "W].Vpu(........
00000120: f3 fa 3f 11 45 9e 9c 58 28 a2 6d 54 45 86 a8 19 ..?.E..X(.mTE...
00000130: 5d b4 b3 50 ee c0 ca d3 16 8c 45 be 9d fa b2 40 ]..P......E....@
00000140: dc c2 1e 0d c1 a8 48 e5 80 61 d8 b9 b6 54 96 78 ......H..a...T.x
00000150: 6b 60 83 ed 63 20 64 6c ee eb 33 b1 ee fd f1 34 k`..c dl..3....4
00000160: ab c8 c7 46 1b 20 c8 1e b6 70 2a c2 2c b4 4c c4 ...F. ...p*.,.L.
00000170: 5d 58 a3 16 e2 73 19 c1 35 6c da 4f dc 67 fa 25 ]X...s..5l.O.g.%
00000180: 1a 99 31 6a 69 21 c5 ca f1 d7 24 d7 d1 51 ff bb ..1ji!....$..Q..
00000190: 34 fe a8 b9 fd 2c 4a 68 26 44 cb df 8f 61 7a 24 4....,Jh&D...az$
000001a0: 13 4f 63 26 c5 41 6a 19 7b 9b 24 3d 5a 5c fd 62 .Oc&.Aj.{.$=Z\.b
000001b0: 7a 39 37 1f 5f bd -- -- -- -- -- -- -- -- -- -- z97._.----------
このバイトパターンが強調表示された行にあることがわかります。ハッシュタイプはSHA-512であることがわかっているため、長さは64バイトでなければなりません。したがって、私の例では、メッセージダイジェストは次のようになります。
05740c00a7b550c72698b9487cdf68e48e4f07825a5f78a1c63093059bddaa36ec8972204f06756e1b89ff2c2bd51aaf7382a6e08550be598a0513d7ca2ccd61
PGP署名メッセージハッシュは、署名されたファイルまたはテキストのハッシュだけではないことに注意することが重要です。一緒にハッシュされる署名の時間を含むいくつかの変数があります。そのため、ファイルまたはテキストのハッシュは署名から取得できません。
メッセージのハッシュが変化することを示すのは簡単です。..少しの間をあけて2つの署名を作成するだけです。
$gpg --list-packets empty1.sig
# off=0 ctb=89 tag=2 hlen=3 plen=435
:signature packet: algo 1, keyid 31EA459B1AA5A792
version 4, created 1514138633, md5len 0, sigclass 0x00
digest algo 10, begin of digest b3 66
hashed subpkt 33 len 21 (issuer fpr v4 9727B646039D8D463EE2394531EA459B1AA5A792)
hashed subpkt 2 len 4 (sig created 2017-12-24)
subpkt 16 len 8 (issuer key ID 31EA459B1AA5A792)
data: [3070 bits]
$ gpg --list-packets empty2.sig
# off=0 ctb=89 tag=2 hlen=3 plen=435
:signature packet: algo 1, keyid 31EA459B1AA5A792
version 4, created 1514138639, md5len 0, sigclass 0x00
digest algo 10, begin of digest 04 0c
hashed subpkt 33 len 21 (issuer fpr v4 9727B646039D8D463EE2394531EA459B1AA5A792)
hashed subpkt 2 len 4 (sig created 2017-12-24)
subpkt 16 len 8 (issuer key ID 31EA459B1AA5A792)
data: [3069 bits]
先頭の2バイトが変更されているため、メッセージハッシュが変更されていることがはっきりとわかります。したがって、署名されたドキュメントが同じで、キーが同じであっても、署名は同一ではありません。