PGP でも GnuPG でもハイブリッド暗号が使われています。これは、対称鍵暗号と公開鍵暗号を組み合わせて使うものです。 通信には対称鍵暗号を用いますが、その対称鍵暗号のセッション鍵は公開鍵暗号で暗号化して自動的にメッセージと結合されて送られます。受信者は公開鍵暗号の秘密鍵を用いてセッション鍵を取り出し、それを用いてメッセージを解読することになります。
GnuPG では基本的には対称鍵暗号として Triple DES, 公開鍵暗号として ElGamal が使われます。また、オプションで他の方式も選べます。サポートされるアルゴリズムは
gpg --version
とすれば表示されます。
秘密鍵 としては CAST5, Blowfish Twofish などが使えるようです。一方、PGP 2.6 で使われていた公開鍵暗号の RSA と共通鍵暗号の IDEA は、PGP 5, PGP 6, GnuPG-1.0.1 のデフォルトの状態では使えません。これは特許の問題があるからです。
従って、今のところ、デフォルトの状態では GnuPG では PGP 2.6 の暗号や署名は複号したり検証したりはできません。[1]
基本的には ElGamal 署名に基づいた DSA (Digital Signature Algorithm) という方式を使います。またハッシュ関数としては基本的に SHA-1 が使われてます。オプションで MD5, RIPEMD160 も選択できます。(これも gpg --version
とすると、サポートされるアルゴリズムが表示される。)
gpg --gen-key
で鍵を生成するとき、DSA と ElGamal を利用するか、ElGamal だけで署名と暗号化を行うか、署名だけしかしないか尋ねてきますが、これは DSA を使う場合は鍵の作成が少し複雑になるので、異なる準備をしなければいけないためです。
暗号を便利に使おうと思えば、秘密鍵は他人から攻撃される可能性のある、例えばネットワークにつなげる計算機にも置いておかなくてはならないでしょう。
GnuPG に限らず、暗号関連のソフトウェアの最大の弱点はこの点にあると思われます。
UNIX ではマルチユーザで使う OS として、ファイルやディレクトリにユーザーやグループごとの読み取り権限を設定することができますし、実際に ~/.gnupg
や ~/.gnupg/secring.gpg
はそのユーザのみが読める設定になっていますが、だからといって秘密鍵が盗まれる可能性は0とは言えません。
そこで、GnuPG も含めて公開鍵暗号を扱う大抵のソフトウェアでは、秘密鍵はパスフレーズを用いて(対称鍵暗号で) 暗号化されて格納します。秘密鍵を取り出すには、毎回このパスフレーズを唱えることになります。
第三者があなたの秘密鍵を手に入れたとすると、それを保護するのはこのパスフレーズだけです。 従って安全に運用しようとするなら、パスフレーズには辞書に載ってるような単語は使わず、数字や記号を入れ混ぜて作るべきでしょう。 パスフレーズに長さの制限はないですが、長くなり過ぎて書きとめないといけなくなるなら逆効果です。 効果的なパスフレーズの作り方はいろいろありますが、自分にとってだけ意味を持つような覚えやすい文の所々を数字や記号で置き換えたり大文字と小文字を取り混ぜたりしたものを使うのも一つの手です。
なおパスフレーズを忘れてしまうと、その秘密鍵は使えなくなるので注意しましょう。
公開鍵暗号を使って暗号文をやりとりしたり、署名を検証したりするには、自分の公開鍵を公開したり、相手の公開鍵を知る必要があります。このとき利用する公開鍵をまとめて入れておくのが、鍵束 (keyring) です。
GnuGP を使う場合、例えば UNIX では、鍵束はホームディレクトリの下の ~/.gnupg
というディレクトリの中の pubring.gpg
というファイルになります。
他人の公開鍵は、全く別の人がその人の名をかたって公開することもできるため、例えば Web などに載っている公開鍵を何の疑いもなく鍵束に追加することは危険です。
そこで、信頼できる人が信頼している公開鍵は信用する、という「信用の輪」を拡げるという手段があります。 PGP や GnuPG では、その人の信用度に点数を付けて、それによってその人が信用している鍵の信用度を計算する仕組が備わっています。もちろん信用度を直接設定することも可能です。
なお、本当に本人のものかを確認する手段としては、後で説明する電子指紋 (digital fingerprint) (鍵指紋 (key fingerprint)) を利用する方法もあります。
例えば A さんが、誰かの鍵を信用していることは、A さんがその鍵に署名に署名することで示されます。GnuGP をインストールした場合は、まず自分の鍵が作成されますが、この時に、自分自身による署名も同時に行われます。流石に自分は信用できるというわけですね。
電子指紋とは、一言で言うならファイルのハッシュ値です。特に鍵の指紋は鍵指紋と呼ばれたりします。
署名のところでも説明しましたが、誰かの公開鍵を見たときに、その公開鍵が本当にその人が作ったものかは分かりません。 仮にその人のウェブページに書かれていたとしても、誰か別の人がクラックして書き換えている可能性もあります。
こうしたとき、普段のメールでいつも公開鍵を添付するようにしていれば、その相手は確かに公開鍵だと確信が持てるでしょう。が、公開鍵は結構な長さです。特に PGP の複数のバージョンと GnuPG を使い分けてる人なんかだと、何種類かの鍵を添付しなくてはならず、困ってしまいます。
そこで、鍵の代わりにそのハッシュ値である鍵指紋を普段のメールのヘッダやフッタに付けておきます。 そうすれば、ウェブページなどに公開鍵を公開したときに、相手はその鍵の電子指紋と、普段送られてくるメールについている鍵の電子指紋を比較することで、公開鍵をチェックすることが可能になるわけです。
GnuPG での電子指紋は
553B 80CD DCC4 5A66 0503 2DD6 52B4 B888 BFF3 8FC0
というような形をしています。見れば分かりますが、40桁の16進数です。4×40 bit, つまり、
2^(4*40)= 1461501637330902918203684832716283019655932542976 通り
の電子指紋が考えられます。GnuPG ではハッシュ関数として SHA-1 が使われていますが、SHA-1 の持つ一方向性から、このハッシュ値を持つ別の公開鍵を作成することはほぼ不可能なため、公開鍵のチェックに使えるというわけです。
[1] 2000年9月には (米国での) RSA の特許が切れる予定なので、そうなると大手を振って RSA が使えるようになると思われます。 (2001年現在、既に使えるようになっています。)