はじめてのGPG 〜第5回 署名・検証をしてみよう〜

2019年8月26日GPG

こんにちは、水珈琲(@mizucoffee)です。

今回は第4回までに作った鍵を使ってファイルの署名・検証をしてみましょう。

Sponsored Links

下準備

まず、署名するターゲットとなるファイルを作っておきましょう。

echo "はじめてのGPG" > file.txt

ファイルの署名

バイナリ形式

$ gpg -s file.txt

というコマンドを実行するだけでファイルへの署名ができます。(-sは--signの短縮形)

file.txt.gpgというファイルが生成されているはずです。試しにファイルを覗いてみましょう。

」g・・ナ^,eーUセ7ャ file.txt]Rル{縺ッ縺倥a縺ヲ縺ョGPG・3  !r\ユ2メネャル棍;ナ^,eーUセ7]Rル{
        ナ^,eーUセ74茁ケノサKG崘>p,3ア*Ⅷ@ソ゚b磧F杵@・sSカト0イ゚E[U宝弃/・㌦k,p・#サタt牘ケ鏗\鯡L」qェ竃伶d・>U"ソ・Z;ホ「ラ6タJ瑣」g凭Pユキ-tC&懇dク
モcァ5チラ・レヌ庁ホ!翫'/f盛/・PM!株セナ]0・カ軫棊M旻ォ・オク€&v賺$キ娉Zア跣米lqp「\!メao・:$]H
シ・ラ&_セァI6ォ#<・ ス貧歎|Z6ⅵメh-f€・ 9「f_kt゙~{&_U咆娑yR・・JチwDK」ュ、゚ヨセルxセ鷙゙・ェ。ム9~N:・鰥サ
スコF奚
マ5ネチ測D鏞・r讃。;艇ュケ*・リミ#誘0サルス-ヌリマ;S゙薮ウヘd四p ・_・ウR蟀<7WDFecェOQタ匁ホgハX擾<'P8*rエo=・ユ*ウツnフ#i鴒ー・tノ・ユ.望劯ヒ・Fキj棉'>|ノ贓5傴・・、>煢`フ|フ}B・IAa@@

見てわかるとおり、バイナリファイルが生成されたようです。

テキスト形式

今度は-a(--armor)オプションを付けて実行してみましょう。

$ gpg -s -a file.txt

するとfile.txt.ascというファイルが生成されます。先程と同じように中身を覗いてみると

-----BEGIN PGP MESSAGE-----
owEBaAKX/ZANAwAIAZ8fKGH7IhQZAawhYghmaWxlLnR4dF1S6tTjga/jgZjjgoHj
gabjga5HUEcKiQIzBAABCAAdFiEEDipqEqJ04tKUy9hBnx8oYfsiFBkFAl1S6tQA
CgkQnx8oYfsiFBnRaQ//TIYQYOerx6itL44+QnTpvxw8TNvW2zaaLYLxORSSXSTO
3mEwCo9cspFPEj2+Z5sp5auW0OuMKeqqwLE1SN3sB8AxrxEpqw9QVol25mTkkJYJ
N5kvqh8is6Oqxh6dB/zYiJG/hwNLDMXTNVqXuu6Uz/bCRGmxCSJ67TUjg8EYDTq3
v1fKpngg9AR9Um5rYEl5rFT5AQki7q02Gz5LDM2/CJw2KSYYexO7emi65oVY7iH+
GEqpvNexn6tN2R5qC12IHdmPLw/tAyCSnSXy84bHDj/B90aYunh1F3GPMSYNt5lO
cx/Z8JDfuUfoRNMQQRfOn7u/Lnnlqecul0+IcZkxMeGof5WFFG+Qasl+SB/fyc8S
8Wb8tf4C21JCTsCHY9Kxm9Sfw+VvpaB577GUPlnahMe/oIw5lQS8VNcPJQeDJ4k3
mFjSnf/3o1scqfOOKmMWL2YPSazp88fAYVRXP9Jq/yyHIzioI3gjc0vHh3LaKmi3
SjOrBlFGN83kI/p92WA6AtJQI3Vcin6hL5nRB9gEBWMDsn0+M3OzdVIyjsDU5NUZ
y9tThZd/C9ocFSuFc96GaNst/LCUU70A92QGoIZQqXz0sNYrb+3a5BlY4vLJ+jgB
noCg1ngOA0NyXX0orY2DGBOVd2+wdcZsfKd5ArZDYQG0kn+IcGgdhfMWDp2EC2c=
=sUa3
-----END PGP MESSAGE-----

今度は、英数字と記号の羅列が出てきました。

-a(--armor)は、出力をバイナリではなくASCII形(テキスト)形式で出力する為のオプションです。

Webサイトやメールの本文でデータをやり取りしたい時に便利なオプションです。

テキスト形式(データ無圧縮)

次は、-sの代わりに--clear-signを使ってみましょう。

$ gpg --clear-sign file.txt

-aの時と同じようにfile.txt.ascというファイルが生成されました。これも中身を覗いてみましょう。

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
はじめてのGPG
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEDipqEqJ04tKUy9hBnx8oYfsiFBkFAl1S6vsACgkQnx8oYfsi
FBndSQ/+NXN4BLC1iKvFmYX19T7D9z3uIf1UkM4uTHkaJCcK+er7i420nXiqB2d1
V4bFJwffAAAQy7s3x56KtTxPHBOI+0fo8y8lwClx73HUwSL4/FzKJzLF6CBuUx4y
mrtj+uhcbXOzAdNLeFdRr0DJHVegn6YdvgMoFEXlYuStq4vw8Xdiue/5+7ILflZt
o4WmkshF0vKLCj1LtrWo3g6/daBEs703WKcB8Nibvb320jZXwwvRi+k/VFOGkxWl
pMP/Jjg2l48zNK7CfYLTLoNE5yAO/xcvJrJqFbDNkNEnHXtPdSDTwzCnOP3DxwiC
KpqLE+elz50B8Q6BN+QQMrlcOA8C1jrG80gu8/H+CtOEbYq4LTbM6/YFkIJU/9+8
iuOf+zjQ1oLREBd5h/0ofiqiZe+4lhz1fXmL4wArPzyGmkzUMNU+Kwl2Nwe6SdA+
hCR7DjEO2/fWGP0MO9NXUqWn3x3US8YnB0qpFzgKmnOo70xCuvaQnhP9lDLTm+CB
ChmOHvbyLrTnZ5K7kealdh+2ftReS82rOcL0DBsZa/GTI84IKBNfD1z4AZkuChHn
pEm8r8IJXq2bGzlbRWq8PseHOlsv5CkDpDnZnP26CUCIfXYrWMq3GsFEjwAFgwEO
W1vA2SrrsIHs2bCfFfwopPWCGQn4F/u9Lx3vYx6hYkXXw7A78mA=
=GPaP
-----END PGP SIGNATURE-----

-aの時とは違い、ファイル上部に署名した元データが入っているのが分かります。

--clear-signはデータを残したまま署名したい時に便利なオプションです。

データと署名を分離

最後に、-sの代わりに--detach-signを使ってみましょう。

$ gpg --detach-sign file.txt

この場合、file.txt.sigというファイルが生成されます。ファイルを覗いてみると

・3  !r\ユ2メネャル棍;ナ^,eーUセ7]R・ 
	ナ^,eーUセ7d *ホヘ靑菟トワヒォmO 蕋祥?テ;yVk・2Qw酩タレ\N・驂[ ワヤ・~\L	奓4ef-=X{Cヲ[笳6G皚cモW・G・・Aルウv彧TェQT	・\w鏸舂ア敢偏A・=X爲・]5cマ・リCqY9m剽iI*ナ'/「ュ・]Qツ涜-hサ6・zユ航ハ@ム・%{`ケ%キNe=pFSノ頭
磔纏・4ヌ瓱'f・=ケリメ ・ェJ・薪B・コ&コ・・C8M)Fgw 5Aァ<_・ヌタヲ	・wヤ・S・モv・丁)ラノエ瘡ラoB・%。ノZHカメ欽タ#ネ゚・hRsfeソKゥ;A・Ak敬-&焏g・ *ノ}d&KモZォ
€!d6)=(貅芥ぷs(A404ヤ4スUsO傭AyHh'c・幔]B・9・ツ・ZXウヘ6ヘホ・xXnナ麻FD(ッfWIbフラ郞エ暘ラp.ト・ス\ス・X。$・2Yヅ鑓ノ縷ェ&来レレコク	gナ熾{\メn}/めxss=hfD「\条ソ・ヨ・f竑

バイナリファイルが生成されました。これは、署名情報のみを格納したファイルです。

バイナリ形式で出力されているということは、-aオプションをつけることでテキスト形式にすることができます。

$ gpg --detach-sign -a file.txt

テキスト形式なので、file.txt.ascというファイルが生成されました。中身は

-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEDipqEqJ04tKUy9hBnx8oYfsiFBkFAl1S64YACgkQnx8oYfsi
FBl7xQ/+IvSR4svDArHBEJrUvlvl3QfyC0nAto4w0OUv8qD7CgxRPBULc6yWUsEo
vIoFojbgH+74d3RNKukCYKQVG0HMFJq0M1Ba3Tp3pbGmB36AcUXSuZe84V0RYI9i
Y3wHPuSf4GZ97PlyRFwDkneGZg75ckBO2Hv5OTjlNXkKeMGJfoW+LL8BSWqzooxt
mOG959QmSaR1bDbiSdJ9i0dgY4p7+gAVkscR3gyvqJ8WVGhZviTYRsIbpZ7+3hVg
zentjUra4g4WlLeLCDiK8yTq4JuyDothzfP/xq3K7cI7ovVvasbS1WOPUT6O7sFa
y6VDBdSDtGEgZJDbnsdqoSNpVcm9Oqb6/mBKoC1Xv4Pf+SJYRRzqjm7Q1rg3rUJL
EsF7fHOU4Dlex91MW3LSKVbndbjrbcsKeiyO/LAXvsLD1tPDtw4jPzCc6QVda0iZ
bevFV/f6BtvzYmi9NHFuS6a4g/gLc6NrXS7YWVG9uOEnX95fQvYaRYiw5qUWzUbU
jJIqtMk4OBknPVVQYxcC7DDbcbo4WNkdQb2VYdSfiEpQmorQCX8l4nzMfanZd3A/
e+VqwpQSBdF9MCiwcde8vxO9TVUgHb0HfAae/b1d3Z+IPO4Ni14Fy5YEjpPYeAAM
NN1/j4iuhgcEGabsAQVcwEq6sXCWS0Y0dZm1IPgUgs+uQrdacPs=
=RZeZ
-----END PGP SIGNATURE-----

といった感じです。

--detach-signを使うと署名されたファイルにはデータが含まれません。そのため署名ファイルとデータを一緒に送信する必要があります。

署名の検証をユーザーに強制したくない場合は、署名ファイルを分離しておくと良いかもしれません。

ファイルの検証

普通の署名ファイルの検証

続いて、先程作った署名されたファイルを検証してみましょう。

検証というのは「署名が正しいものか」を確認することです。

$ gpg --verify <file>

というコマンドで検証することができます。

では、file.txt.gpgを検証してみましょう。

$ gpg --verify file.txt.gpg
gpg: 2019年08月13日 16時49分12秒 UTCに施された署名
gpg:                RSA鍵0E2A6A12A274E2D294CBD8419F1F2861FB221419を使用
gpg: "Ritsuki Goto <i@mizu.coffee>"からの正しい署名 [究極]

正しい署名と表示されているので問題ないようですね。ascファイルも同じように検証出来ます。

分離されたの署名ファイルの検証

署名とデータが分離されている場合は、データを同じ階層に配置しておく必要があります。

$ gpg --verify file.txt.sig
gpg: 署名されたデータが'file.txt'にあると想定します
gpg: 2019年08月13日 16時53分36秒 UTCに施された署名
gpg:                RSA鍵0E2A6A12A274E2D294CBD8419F1F2861FB221419を使用
gpg: "Ritsuki Goto <i@mizu.coffee>"からの正しい署名 [究極]

ファイル名が変更されている場合は

$ gpg --verify <署名ファイル> <データファイル>

とすることで検証することが出来ます。

$ gpg --verify file.txt.sig file.txt
gpg: 2019年08月13日 16時53分36秒 UTCに施された署名
gpg:                RSA鍵0E2A6A12A274E2D294CBD8419F1F2861FB221419を使用
gpg: "Ritsuki Goto <i@mizu.coffee>"からの正しい署名 [究極]

注意点

署名をした人の公開鍵を持っていないと、署名を検証することができません。

今回は自分が署名したので特別な手順は不要ですが、例えば署名されたファイルがメールで送られてきた場合は、相手の公開鍵をインポートしておく必要があります。

拡張子まとめ

  • .gpg バイナリファイル
  • .asc ASCII形式(テキスト)ファイル
  • .sig バイナリファイル(署名情報のみ)

ファイルの復元

ファイルの検証では、署名の正当性は検証出来ましたが、残念ながらファイルの中身を確認することは出来ませんでした。

--verifyは署名が正しいかどうかだけを検証するオプションだからです。

元のデータを復元するには、オプション無しで第一引数にファイルを指定します。

復元を実行する前に元のファイルを削除しておきましょう。

$ rm file.txt

では、実際に復元してみましょう。

$ gpg file.txt.gpg

file.txtが生成されたはずです。中身に「はじめてのGPG」とあれば成功です!

分離された署名ファイルの場合は、そもそもデータがそのままの形であるので復元は不要ですね。

まとめ

今回は、署名をしてみました。結構手軽に署名出来たのではないでしょうか?

次回はいよいよ暗号化です!多分一番面白いところです!