MacでGnuPGを使った署名を行ってみる
GnuPGとはChain of Trustによる信頼モデルに基づいたPKIであり,これを用いると,署名,暗号化などを行うことが出来る.SSLなどの方式では,信頼できる第三者の存在(例えばVeriSignなど)が必要であるが,GnuPGではそれが必要ない.その代わり,どの公開鍵を信用するかといったことが,完全に自分に任されてしまう.
$ sudo port gnupg2
次に,公開鍵と秘密鍵を作成.
$ gpg2 --gen-key Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection?
ここは,RSAで問題ない.古いGnuPGのドキュメントでは,特許の関係からDSAとElgamalが推奨されているが,RSAは既に特許の期限がきれているため,RSAで良い.したがって,そのままリターンキーを押せば良い.
次に鍵長を選択する.
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048)
デフォルトでは2048ビットとなっているが,これもこのままで問題ない.鍵長が長ければ,暗号の強度が増すが,署名や暗号化に必要な計算量も増加してしまう.
RSAが現在解読されているビット長は,768ビット程度だそうである*1.仮に,1年に2倍の速度でCPUの演算能力が向上していったとしても,1024ビットのRSA暗号が解読可能となるのは,単純に計算して1024 - 768 = 256年以上も先のことである.
実際には,途中でより効率的な方法が見つかり,256年よりも少ない年数で解読される可能性がある.仮に今より10倍効率的に素因数分解を行う方法が発見されたとしたら,1024ビットのRSAはあと25年程で解読されるだろう.しかし,2046ビットにしておけば,それでも100年は解読に必要な計算となる.まぁ,そもそもムーアの法則が崩れているので,CPUの演算能力が1年につき2倍になると言う仮定自体が怪しいが・・・
あとは,自分の名前と,メールアドレス,コメントを入力して,鍵の生成は終わり.
Real name: あなたの名前 Email address: あなたのメールアドレス Comment: コメント You selected this USER-ID: "Your Name <your@mail.address>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o You need a Passphrase to protect your secret key.
生成された鍵などは,~/.gnupg 以下に保存される.
生成された公開鍵を出力してみる.-a オプションを付けると,asciiフォーマットで出力される.-a を付けないと,バイナリで出力される.ちなみに,自分の公開鍵は以下の通りとなる.
$ gpg2 --export -a -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.13 (Darwin) mQENBEwZ5g4BCADLx8o1gTvMr9+wSEIc4ljwxNlsRYThpquMLQc2WUTZOPHqLerB EH9fZ8oYDIM88UwXIaCyBPFhi76Z2/UphTTQyH8DkGR9DcG9HVgcMsR5SVyroLb9 drMgn8dcyeyEc5u3Zs9CFAuAmPUTV2kutBYcMB9dQJF2NtD6D9Qa4XHZNvUxxUfd q9FRxohAk2j7NS23M3l/1vJd+YCxOe3xCGgBPL1dt4TkQd57XdZcLlcF8Dy+Pc+f qahkWguffOM8l3oEHwSrNY8E8W4gkHZHh2Qmi06VjHIMTC+13ThTSV3satZ0A3ZN KMDLW9e3UXl9oGPf9qIhdek8moBlliTFMm3JABEBAAG0JFl1dWtpIFRha2FubyA8 eXRha2Fub3N0ZXJAZ21haWwuY29tPokBOAQTAQIAIgUCTBnmDgIbAwYLCQgHAwIG FQgCCQoLBBYCAwECHgECF4AACgkQYse63oXQ6Xb/rwf+Pe2IF0c0LbRCQ8SIGyFG A4S/nlwo8B27tPEbS8MoUUpGg02bVozozEdpanzIdBrSDwZrQSMLYap0kk+d2Q5t 1H2b2VfQblol8STnP0yyaecdiT9TaOnuBxube13wrl0ZjXmoN2JKaXaqx0A6B9FL a6oVAGcW9zbFOjJa7U8IgXInXnl/uhbbLmG52GFrJe5pw1j0t95UN6HS3ZeU63WR 7WOLz628ZApceOKddbtIOw8V/YfXBoqMrY9VHMmvgNDYfwecZi3W3JenQvpVjNwp mUVdR84V1+5YXk57CvLMruaWselDvmEvVn0sog0iEXchVgHKisni3glI942CxkEf ZrkBDQRMGeYOAQgAvqJ8gX2sQLtJ019xtdcu1R4XELksutGm0m4YbhZJwAyJT2Dt sEHePm3TPuU88wIrwwFq5rDaG7VgzE1F05R5yjW8+B1xh5EyavrMn3xTdeuIn475 1T7vSFa1mZc6t3nWqGyJHwBUeU8jbwwUk3AYkrmVDvAQFEirZl3JRo1gi78O6USU xDsi3TcJ+Zy6EiqK6JZT4mOp9fNnNhhiMmsDydU3uALRxuVvnfep8czpWLgc/Ctv MfNMrh17y9NAMlIRXFXAQLBaBr6hNkGqD6s1knrrWMH/2BrIL5AMMDrgPgBkmtwM dg6G1aWX72aVf5QEha4Ck3g7WlpBW4Srn6NstQARAQABiQEfBBgBAgAJBQJMGeYO AhsMAAoJEGLHut6F0Ol2THAH/1jpQPR2h7eb9qgEo6CPQCkxazQoL5QRudD4jzzo n7THKpDCdT6nIrBDieiBQ2eb1L1mrg2jMyjEb+k1YDQLvaFUfNsLO6vjgFSynEqa y6FIdQHsHDL4dkLHB5dtc11Y5AOPN9HVxon7BUUZMOrYj+Vpxrukj5gb2j21vmkc BcwQDjCWdCI+QqiDoJ94lm/rk2DfZ7wvYmKTqNh7iPE3KCR6XmU5Hr0mTfqrtb6v 2w9+yjKEkU5ncJMcvPM1taNO1tbSlBVp0VaqwiS3mOH3zKxd3/Zmdd24cSvTSIa7 9fNER/5BMYdb/5td1BN8L2sAdo8cVi5NfDM/V0fdLnRejpA= =/IMO -----END PGP PUBLIC KEY BLOCK-----
公開鍵のフィンガープリントを表示する.
$ gpg2 --fingerprint pub 2048R/85D0E976 2010-06-17 Key fingerprint = C5BF 64CF BF44 6072 01B9 44C6 62C7 BADE 85D0 E976 uid Yuuki Takano <ytakanoster@gmail.com> sub 2048R/C5A5F02F 2010-06-17
署名する前に,署名するデータを作成.
$ cat test.txt test
test.txtに署名し,署名を確認.a オプションでasciiで署名が生成される.
$ gpg2 -sa test.txt $ cat test.txt.asc -----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.13 (Darwin) owEBQwG8/pANAwACAWLHut6F0Ol2AawTYgh0ZXN0LnR4dEwZ8SF0ZXN0CokBHAQA AQIABgUCTBnxIQAKCRBix7rehdDpds/GCACrKZ2fw6/ZgTZLL7XxrHutA6YhlrRP ekeKifSJYfJuSCOdfcKB2ikZSnYWk3O5zZ9NR7NyJTINN4qF1khSgodkBj425DtU EkR1OijwmFnuPW28iliKCIIvRaCivW4/7tgB6/4HmwLu1raWl0uXrnFJssk8t0k9 flbn+TAY2WnpMcXY4LwMiYgq7QCOQyR5/PBg78V1ACvpbY4z3Rmb+BHZgypPbS87 eG9ova0d1mNOB1SOB/+jXmkkd9Ja3pKVU2Ow1BUOtHjE5Lg+f8NU1kO2VCiM5jsD q5f7wMLqaLSoSPb0f0JqS12h8l47PUeUeAqWDzQXx8UUn3TY/MzRQhUG =T6v2 -----END PGP MESSAGE-----
生成した署名を検証する.
$ gpg2 --verify test.txt.asc gpg: Signature made 木 6/17 18:55:45 2010 JST using RSA key ID 85D0E976 gpg: Good signature from "Yuuki Takano <ytakanoster@gmail.com>"
自分で署名して,自分で検証しているというつまらない結果だけど,簡単にできた.本当ならば,--importで他人の公開鍵をインポートして,他人の署名を検証するのが正しい使い方となる.
なお,暗号化するときは -e オプション,復号するときは -d オプションで行うことができる.
*1:スイスの研究者、700ビットRSA暗号レベルの難問解読に成功 http://www.computerworld.jp/news/sec/65369.html