MacでGnuPGを使った署名を行ってみる

GnuPGとはChain of Trustによる信頼モデルに基づいたPKIであり,これを用いると,署名,暗号化などを行うことが出来る.SSLなどの方式では,信頼できる第三者の存在(例えばVeriSignなど)が必要であるが,GnuPGではそれが必要ない.その代わり,どの公開鍵を信用するかといったことが,完全に自分に任されてしまう.

まずは,Mac Portsを使ってインストール.

$ 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