叛乱オンライン
HOME > Theory > Crypt

暗号を使おう!

 
The comp.security.pgp FAQ
Version 1.4
 

4. 鍵

  • 4.1 どれくらいの長さの鍵を使うべきか?
  • 4.2 PGPは新しい鍵を鍵束に追加するのにどうしてそんなに時間がかかるのか?
  • 4.3 一つの装甲ファイルに複数の鍵を抜き出す方法は?
  • 4.4 同じアドレスに同じメッセージを二回暗号化してみて、完全に違う出力を得た。なぜか?
  • 4.5 一人で二つの鍵を持っていたり、同じユーザーIDの公開鍵があるとき、あるいは同名の異なったユーザーがいるときには、どうやって指定したらいいのか?
  • 4.6 「未知の署名、チェックできません」"Unknown signator, can't be checked" とはどういうこと?
  • 4.7 PGPで鍵の信頼度を表示させる方法は?
  • 4.8 フィンガー経由で私の鍵を有効にするには?
  • 4.9 私は鍵を .signature(シグネチャ)に入れるべきか?
  • 4.10 公開鍵は偽造できるか?
  • 4.11 偽造鍵の検出法は?
 

4.1 どれくらいの長さの鍵を使うべきか?

PGPは鍵のサイズについて三つの選択肢がある。512, 768, 1024ビットである。これらの数字が気に入らなければ、あなたの鍵が持つべきビット数を指定できる。鍵が大きくなればなるほど、暗号化のRSA部分は安全になっていく。プログラムの動作時間で鍵サイズによって大きく代わってくるのは、鍵生成の時間だけだ。1024ビット鍵は384ビット鍵の8倍の時間が生成にかかる。幸運にも、あなたが別の鍵ペアを生成しようと思わない限り、これは繰り返す必要のない一度限りのプロセスである。

暗号化の間では、暗号化プロセスのRSA部分だけが鍵の大きさに影響される。RSA部分は、IDEAによって使われた一時鍵を暗号化するのに使われるだけである。メッセージの主要部分は、RSA鍵サイズの選択に少しも影響されない。だから、ほかに何か理由がない限り、1024ビット鍵サイズを選ぼう。素因数分解のために現在有効なアルゴリズムを使えば、384と512ビットの鍵は手の届かないよい選択とはいえない。

MIT PGP 2.6.2, ViaCrypt PGP 2.7.1, PGP 2.6.3iを使っているなら、1024ビット以上の鍵サイズも指定できる。これらのプログラムの上限は2048ビットだ。1024ビット以上の大きさの鍵をほしいなら、どの程度大きな鍵が必要かをPGPに伝えなければならないことを忘れてはならない。この長さの鍵を生成するには時間がかかる。しかし、これも上述したとおり、一度きりのプロセスだ。他の版のPGPを使っている人は、あなたの大きな鍵を扱えないかもしれないことを忘れてはならない。

MIT PGP 2.6.2のある版には小さなバグがあって、2048ビットの鍵を作るようにいっても、実際には2047ビットの鍵を作ってしまう。

 

4.2 PGPは新しい鍵を鍵束に追加するのにどうしてそんなに時間がかかるのか?

鍵署名をチェックし、公開鍵束に追加するのに必要な時間は、あなたの既存の公開鍵束サイズの2乗に比例して大きくなる。鍵サーバーから手に入れた完全公開鍵束(質問8.1参照)をあなたの鍵束に追加しようとしたときには、とんでもないことになる。

この場合、あなたの公開鍵束の名前を何かに変えて、それから鍵サーバーの鍵束を"pubring.pgp"とし、あなた自身の鍵束を大きなほうに追加すればいい。しかし、これには危険がある。あなたの古い鍵への信頼パラメーターは失われ、この大きな鍵束からの信頼パラメーターを使うことになるということである。

 

4.3 一つの装甲ファイルに複数の鍵を抜き出す方法は?

多くの人は、利用可能にしたい複数の公開鍵を持っている。このための方法の一つは、鍵束から抜き出したいそれぞれの鍵について"-kxa"コマンドを実施して別々の装甲ファイルに入れ、それから複数の装甲ブロックのある一つの長いファイルにすべてのファイルをつなげてしまうことである。これはあなたの鍵のすべてを一つの装甲ブロックに入れるほど便利ではない。

あいにく、PGPの現在の版では、こういうことはできない。だが、幸い、間接的にやるほうほうがある。

pgp -kx ユーザーID1 extract
pgp -kx ユーザーID2 extract
pgp -kx ユーザーID3 extract

これで三つの鍵をすべてextract.pgpに入れることができる。Ascii 装甲ファイルを作るには、pgp -a extract.pgp

で extract.asc が手に入る。pgp extractとして同じファイルプロセスをたどるなら、三つの鍵が同じように処理される。

Unix スクリプトで、一つのコマンドで抽出するには以下のようにする。

  #!/bin/sh
  for name in name1 name2 name3 ... ; do
  pgp -kx $name /tmp/keys.pgp <keyring>
  end
同じくDOSコマンドなら、
for %a in (name1 name2 name3 ...) do pgp -kx %a keys.pgp <keyring>
 

4.4 同じアドレスに同じメッセージを二回暗号化してみて、完全に違う出力を得た。なぜか?

PGPを実行するたびに、違ったセッション鍵が生成される。このセッション鍵はIDEAのための鍵として使われる。その結果、メッセージのヘッダと本文の全体が変わる。同じメッセージを同じアドレスに何度暗号化しようとも、同じ出力を二度と目にすることはない。これは、PGPの安全性を高めている。

このランダムなセッション鍵を生成するために、PGPは'randseed.bin'というファイルからの情報を利用しようとする。もしこのファイルがなければ、あるいは何らかの理由で十分なランダムさが足りなければ、いくつかのランダムなキーボード入力を要求され、それが乱数生成のもととして使われる。

 

4.5 一人で二つの鍵を持っていたり、同じユーザーIDの公開鍵があるとき、あるいは同名の異なったユーザーがいるときには、どうやって指定したらいいのか?

PGPコマンドのID部分で、ユーザー名を指定する代わりに鍵IDナンバーを使うことができる。フォーマットは0xNNNNNNNNで、NNNNNNNNが8文字のユーザー鍵IDナンバーである。IDナンバー全体を入力必要はなく、IDの中の連続した何桁かだけでもかまわないということに注意すべきだ。鍵IDは、pgp -kv ユーザーIDとやったときに、鍵サイズの直後に示されている。

慎重に:"0x123"と入力したとき、0x12393764, 0x64931237, 0x96412373と一致するだろう。"123"をどこかに含む鍵IDが一致したものとされる。その鍵IDの文字で始まる必要はない。これは、Cプログラム言語で16進数を入力するときのフォーマットであることがわかるだろう。たとえば、以下のコマンドは私の公開鍵にファイルを暗号化するのに使える。

    pgp -e <ファイル名> "Arnoud Engelfriet"
    pgp -e <ファイル名> galactus@stack.nl
    pgp -e <ファイル名> 0x416A1A35
この鍵識別と同じ方法が、config.txt ファイル中の"MyName"変数でも、メッセージ暗号化に使う秘密鍵束の鍵を正確に指定するために使える。
 

4.6 「未知の署名、チェックできません」"Unknown signator, can't be checked" とはどういうこと?

これは、署名を作るために使われた鍵があなたの公開鍵束に存在していないことを意味している。いつか未来に、あなたがその鍵を公開鍵束に付け加えることがあったら、そのとき、署名部分がふつうに読めるようになるだろう。これらのチェック不能署名をあなたの公開鍵束に残しておいても絶対に無害だ。問題の鍵の有効性を追加も削除もしないからである。
 

4.7 PGPで鍵の信頼度を表示させる方法は?

-kc オプションを実行するときにはひとりでに全体のデータベース上で表示されている。パラメーターは、コマンドラインでIDを指定したときには見えない。正確なコマンドは、pgp -kcpgp -kc smith コマンドは、smith への信頼度パラメーターを示さない。
 

4.8 フィンガー経由で私の鍵を有効にするには?

最初にやることはいつものとおり、pgp -kxa で鍵をASCII装甲テキストファイルに抜き出すことである。それからあとは、あなたが鍵を生かしたいコンピューターのタイプによって決まる。あなたのコンピューターやネットワークソフトの文書をチェックしてほしい。

Unix風に作動している多くのコンピューターは、".plan"と呼ばれる各ユーザーのホームディレクトリにあるファイルからフィンガー経由で表示された情報を読む。もしあなたのコンピューターがこれをサポートしているなら、公開鍵をこのファイルに入れてもいい。そのファイルはどこからも読みとることができるようにすること。他の人があなたのplanを読めないなら、chmod 644 .plan とやる。ホームディレクトリもまたアクセスできるようにすべきだ。ホームディレクトリで、chmod +x . とやること。さらに問題があるなら、システム管理者に尋ねてほしい。

 

4.9 私は鍵を .signature(シグネチャ)に入れるべきか?

入れてはいけない。あなたの鍵をできるだけ広めることは大事なことだが、それは鍵サーバーに送る(A HREF="faq-08.html#8.1">8.1参照)か、フィンガー経由で有効にする(4.8参照)か、あなたのWWWホームページからのリンクとするほうがずっといい。このやり方なら、あなたの鍵を必要とする人が手に入れることができるし、あなたもそれを数多くのつまらない人に毎回メールで送ったり投稿したりする必要がなくなる。

加えて、あなたの送信メールを盗み読みしている者は簡単にあなたの公開鍵を自分の偽造鍵に変更できてしまうということを心に留めておくように。それから彼はあなたに送られてきたメッセージを読めるだろう。もし別の集団が別の場所から別の方法であなたの鍵を手に入れたとしても、盗み読み君(snooper)が鍵を変えるよりずっと手間がかかる(鍵を含むメッセージを署名しても役に立たない。盗み読み君は簡単に自分の鍵でメッセージに再署名できるからだ)。

 

4.10 公開鍵は偽造できるか?

公開鍵には4つの構成要素があり、それぞれに弱みを持っている。4つの構成要素とは、ユーザーID、鍵ID、署名、鍵指紋である。

ユーザーID

偽ユーザーIDを作るのは何とも簡単だ。鍵のユーザーIDが変えられて、その鍵が別の鍵束に追加されたら、変えられたユーザーIDは新しいユーザーIDのように見え、そのためすでに存在しているものに追加されるだろう。これは、未署名ユーザーIDは信用してはならないということを意味している。質問6.3では、このことについてさらに詳しく論じている。

鍵ID

選ばれた鍵IDで鍵を作成することが可能だ。Paul Leyland <pcl@sable.ox.ac.uk> はこう説明する。
PGP鍵IDはパブリック・モジュールの最後の64ビットである(が、pgp -kv ではそのうち最後の32ビットしか表示されない)。掛け合わせたときに指定された低い桁のビットと同じになるような二つの素数を選ぶことは簡単だ。
これは、既存のものと同じ鍵IDの偽鍵を作ることができるということだ。それでも、鍵指紋はまだ違うのだが。

ともあれ、この攻撃はDEADBEEF(死んだ牛肉)攻撃といわれる。この用語はもともと、これが可能であるというデモンストレーションとして作られた鍵ID 0xDEADBEEF という鍵の例からきている。

署名

だれかの鍵のユーザーIDのための偽署名を作る方法は、今のところない。ユーザーIDのための署名を作るには、署名者の秘密鍵が必要だ。署名は実際に当てはめられるユーザーIDの改作部分に署名するから、署名を無効にしないで、あるユーザーIDから別のものに署名をコピーしたり、署名されたユーザーIDを変更することはできない。

鍵指紋

はい、既存のものと同じ鍵署名を持つ公開鍵を作ることはできる。PGPの設計上の誤った機能のおかげで。偽造鍵は同じ長さにはならないから、簡単に見分けることができる。ふつう、そういう鍵は妙な鍵の長さになっている。

Paul Leyland は、このような技術的説明をしてくれた。

PGP鍵の中では、パブリック・モジュールと暗号化指数がどちらも、ビットの量そのものに従って、ビットの量のサイズとして表現されている。pgp -kvc で表示される鍵指紋は、ビットのMD5改作部分だが、長さのではない。モジュールの下のほうの桁を指数の高い桁の部分に移して二つの長さを変更するなら、まったく同じ鍵指紋の新しい鍵を作ることができる。
 

4.11 偽造鍵の検出法は?

質問4.10で説明したように、公開鍵のそれぞれの部分は偽造できる。しかし、すべての部分が一致する偽造鍵を作ることはできない。

このため、だれかの鍵を使うときには、常にその鍵ID、指紋、鍵サイズが一致しているかどうか確かめるべきだ。そしてユーザーIDに署名するときは、それが鍵の持ち主によって署名されていることを確かめよう!

同様に、もしあなたが自分の鍵についての情報を提供したいならば、鍵ID、指紋、鍵サイズについて述べるべきだ。

 
[ PGP-FAQ目次]
[ 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11]
[ 追補 ]
[ このFAQについて | 用語集 | 著作権]
 

HOME > Theory > Crypt

2000年盗聴法対抗
ダウンロードPGP6.5.1iPGP disk
日本語化PGP鍵作成
PGPdiskマウント秘密鍵を隠す
落とし穴
完全抹消法

PGP ユーザーズ・マニュアル 第1巻
The comp.security.pgp FAQ 日本語版
パスフレーズFAQ 日本語版
バックドア NSAPhrack Magazineソースコード
暗号関係リンク集

叛乱オンライン