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

暗号を使おう!

 
The comp.security.pgp FAQ
Version 1.4
 

2. 非常に一般的な質問と問題

  • 2.1 なぜ私のヴァージョン2.6メッセージを、ヴァージョン2.3を使っている人は読めないのか?
  • 2.2 PGPはなぜ時々署名チェックについて不満を言うか?
  • 2.3 メッセージの暗号化/復号化メッセージになぜそれほど長くかかるのか?
  • 2.4 第2鍵束を作る方法は?
  • 2.5 PGPはどのように複数アドレスを扱うか?
  • 2.6 PGPを電子メールやニューズ・システムと統合するためのスクリプトはどこで手に入るか?
  • 2.7 他の人あてに暗号化したメッセージを私も復号化できるようにするには?
  • 2.8 なぜ私はUnix用PGPで鍵を作れないのか?
  • 2.9 PGPで文書にクリア署名するとき、「ダーシ+スペース」が私の本文に追加される。これは何なのか?
  • 2.10 複数ファイルを同時に暗号化するには?
  • 2.11 パスフレーズを自動的にPGPに渡すには?
  • 2.12 'randseed.bin'がウィルス感染したらどうしたらいいか?
  • 2.13 MacPGPはなぜ秘密鍵を見つけられないのか?
  • 2.14 TZ変数の設定法は?
  • 2.15 PGPコマンドが働いたかどうかを知るには?
  • 2.16 PGP 5.0はなぜもうランダムなキー入力を要求してこないのか?
  • 2.17 PGP 5.0/5.5とPGP 2.6.xは相互互換的か?
 

2.1 なぜ私のヴァージョン2.6メッセージを、ヴァージョン2.3を使っている人は読めないのか?

あなたはおそらく、MIT PGPを使っているか、"legal_kludge"オプションのあるヴァージョンのPGPを使っているのだろう。

PGPの特許権問題を解決させるためになされた合意の一つとして、MIT PGPはメッセージ復号化についてのフォーマットを以前のPGP 2.4とそれ以前のバージョンから少々変更した。このフォーマットの変化は、1994年9月1日にMIT PGPに書き込まれた。そのため、その日以降のMIT PGPで暗号化されたメッセージはすべて、2.4(以前)では読めない。2.4以前の版を使っている人はアップグレードすべきであり、特許権違反版はもう使わない、というわけである。

ここで一番いいやり方は、あなたの友人にPGPの新しい版にアップグレードさせることだ。そうでなければ、もしあなたが非MIT版を使っているなら、"legal_kludge"オプションをあなたの文書の中で調べてほしい。あなたのPGPが旧式のメッセージを作れるように設定できるだろう。2.6.2iと2.6.3iでは、これは config.txt ファイル内で Legal_Kludge=offとやればいい。

「古い」出力は新しい版でも完全に読めるので、もしあなたがMITと2.3ユーザーの間でやりとりしているなら、config.txt で Legal_Kludge=off と設定するのが一番いいだろう。

 

2.2 PGPはなぜ時々署名チェックについて不満を言うか?

ヴァージョン2.3aは "pkcs_compat" オプションを導入し、産業標準と互換性をもたせるために署名のフォーマットを少々変えた。MIT PGPはRSAREFライブラリを使うので、古い署名フォーマットを理解できず、そのため署名を無視し、そうするときには警告を発する。

この問題は、ほっとんど古い鍵署名で起こる。もしあなたの鍵がそういう古い署名を含んでいるなら、あなたの鍵に署名した人たちに新しいヴァージョンのPGPで再署名するよう頼んでみよう。

古い署名がチェックに不可欠なほど重要であれば、ViaCrypt版などのPGPの非MIT版を手に入れてチェックすればいい。

 

2.3 メッセージの暗号化/復号化メッセージになぜそれほど長くかかるのか?

この問題は、あなたがどこかのサーバーから公開鍵束全体を持ってきてpubring.pgpファイルに置いたときに起こるかもしれない。PGPは必要な一つの鍵を見つけるために、数千個の中から検索しなければならないのだ。この問題の解決策は、二つの公開鍵束を作ることである(質問 4.2 参照)。第一の束は普通のpburing.pgp ファイルで、これにはあなたが頻繁にメッセージを送る人だけが入っている。第2の鍵束は、あなたの必要な鍵が短い束にないときのために、すべての鍵を含んでいるものだ。もちろん、あなたは第二の鍵束を使ってメッセージを復号化するときにはいつも、鍵ファイル名を指定しなければならない。こうすれば、短い鍵束の中にある人へのメッセージ暗号化・復号化するとき、その過程はずいぶん早くなるだろう。

暗号化と復号化の時間は、鍵の大きさに伴っても増える。2048ビット鍵は、たとえば512ビット鍵よりもずっと時間がかかるだろう。

 

2.4 第2鍵束を作る方法は?

最初に、デフォルトのpubring.pgpファイルに超巨大な公開鍵束のすべてが入っているとしよう。まず、-kxオプションを使って、あなたがふつうに使う鍵を別の鍵ファイルに抜き出す必要がある。次に、pubring.pgpを何か別の名前に変える。この例では、"pubring.big"という名前を使うことにしよう。それから、-kaオプションを使って、前もって作成していた個々の鍵ファイルをそれぞれ新しいpubring.pgpに追加していく。短いデフォルトファイルで、誰かへのメッセージを暗号化するには、 pgp -e <ファイル> <ユーザーID>コマンドを使う。長い鍵束内のだれかへのメッセージを暗号化するには、
pgp -e +pubring=c:\pgp\pubring.big <ファイル> <ユーザーID>
コマンドを使う。第2の鍵束のときは、完全なパス・ファイル名を指定する必要があることに注意。ファイル名だけでは発見してくれないだろう。
 

2.5 PGPはどのように複数アドレスを扱うか?

複数アドレスへのメッセージを暗号化するとき、暗号化ファイルの長さは、追加されたアドレスに対してごくわずかだけしか増えないことに気づくだろう。メッセージが追加されたアドレスに対してごくわずかしか増えない理由は、メッセージ本体の暗号化がランダムな一時的鍵とIDEAを使って一度だけされているからである。そのため、アドレスごとにこの一時的鍵を暗号化し、メッセージのヘッダ部分に置くだけでいいのだ。それゆえ、メッセージ全体の長さは、追加のアドレスに対するヘッダの部分の大きさだけ増えるということになる(同じメッセージを複数の受け手に暗号化するときのRSAの既知の弱点を避けるために、IDEA一時的鍵はRSA暗号化のたびごとに違ったランダム・データを使う)。
 

2.6 PGPを電子メールやニューズ・システムと統合するためのスクリプトはどこで手に入るか?

PGPを使いやすくするための多くのスクリプトやプログラムがある。そのすべてへの目次が、http://www.primenet.com/~shauert/ にある。

このサイトで触れられていないシェル、スクリプト、フロント・エンドを知っているなら、URL(またはその他の有用な情報)をこのサイトのオーナー (Scott Hauert, <shauert@primenet.com>) に知らせてほしい。私にではなくて。

 

2.7 他の人あてに暗号化したメッセージを私も復号化できるようにするには?

従来の暗号化では、あなたは暗号化されたファイルに対してPGPを実行して、暗号化に使ったパスフレーズを入力すれば、メッセージが読める。

PGPの公開鍵暗号化を使うと、あなた自身のためにも暗号化しない限り不可能だ。

文書化されていない設定、EncryptToSelf(自己への暗号化)がある。メッセージを暗号化するとき、常にあなたのためにも暗号化させるには、CONFIG.TXTファイルで設定するか、コマンドラインでこれを on にするとよい。しかし、もしあなたの鍵が解読されるなら、「クラッカー」はあなたが受け取ったものだけではなく、あなたが送ったメッセージもすべて読めるっようになってしまうということに注意してほしい。

 

2.8 なぜ私はUnix用PGPで鍵を作れないのか?

一番ありそうなのは、PGPが公開鍵束と秘密鍵束のファイルを作れないために起こる現象だろう。もし環境変数PGPPATHが定義されていないなら、PGPはこれらのファイルを、あなたのホームディレクトリのサブディレクトリ".pgp"に置こうとする。必要なディレクトリが作れなければ、つまりディレクトリがまだなければ、PGPは鍵生成後壊れてしまう。これは、書き込み禁止ディレクトリにPGPPATHを指定していても起こる。

解決法は二つ。PGPPATH環境変数を、あなたの鍵束のある場所に指定する。あるいは、鍵を作る前に、mkdir $HOME/.pgp; chmod 700 $HOME/.pgp を実行する。

 

2.9 PGPで文書にクリア署名するとき、「ダーシ+スペース」が私の本文に追加される。これは何なのか?

PGPは、PGPメッセージの開始を示す "-----BEGIN PGP MESSAGE-----"(とその関連)ヘッダのために、こういうものができる。混乱しないように、初めにダーシがある規則的なテキストのすべての行頭に"- "をつけるのである。あなたがメッセージのサインをチェックするときには、この追加分の"- "を取り除き、もともとの出力を書き出すことになる。

これはまた、"From "などの「特別な」句で始まる行にも追加される。これらの行は、メール基準に沿うようなメールプログラムでさまざまに「無視」されかねないからだ。そうなると署名が無効になってしまう。

 

2.10 複数ファイルを同時に暗号化するには?

PGPは、ふつうは、コマンドラインでは一つのファイルだけを受け入れる。多くのプラットフォームでは、「バッチ」でプログラムを呼び出すことができる。これを使えば、複数ファイルをPGPで自動的に呼び出すことができる。

MS-DOSとOS/2では、以下のとおり。

for %a in (*.*) do pgp -ea %a ユーザーID

これらのファイルをすべて暗号化するのにパスフレーズを指定するために、文書化されていない"-z"オプションを使って、この方法で従来の暗号化を行なうこともできる。

for %a in (*.*) do pgp -c %a -z"パスフレーズ"

UNIXでは、以下の通り。

for a in *
do
  pgp -ea $a userid
done

いくつかのシェルやフロントエンドは、通常、複数ファイルを一度に暗号化できるようになっている。

 

2.11 パスフレーズを自動的にPGPに渡すには?

このためには3とおりの方法がある。一番簡単なのは、おそらく、環境変数PGPPASSにパスフレーズを含めることだろう。DOSでは、set PGPPASS=私の秘密のパスフレーズ とやればいい。

これはまったく安全ではない。あなたの環境にアクセスできる人は誰でも、あなたのパスフレーズを見ることができる。これは、あなたの昼食中にやってきて、パソコンで"set"と入力すれば、誰でもわかる。UNIXのいくつかの変形では、他の人の環境を試すことができてしまう。

別のオプションとしては、特にシェルに有用だが、-zオプションを使うものである。PGPコマンドラインで -z"私の秘密のパスフレーズ" と付け加えればいい。スペースや、< や > といった「特殊」文字がパスフレーズに含まれるときは、引用符で囲むこと。コマンド命令と混同されるかもしれないからだ。

これは、マルチユーザーシステムではさらに安心できない。オプションで渡された命令も含めて、あなたが起動しているプログラムを誰でも見ることができるからだ。

一番いいが、一番複雑な方法は、PGPPASSFD環境変数を使う方法である。この変数は、パスフレーズの含まれるファイルを指定する「ファイル記述子数」を含んでいる。これは、適切にファイルのパーミッションを設定するなら、スーパーユーザー以外からパスフレーズを守る。

以下は、 Jack Gostl <gostl@argos.argoscomp.com> による。

pgp262配布版のappnotesファイルに、これについてのことが見つかるだろう。もしPGPPASSFDを0に設定すれば、pgpはスタート直後にstdinからパスフレーズを読むだろう。
PGPPASSFD=0; export PGPPASSFD
echo "PassPhraseHere" | pgp -east file recipient1 recipient2..
Patrick J. LoPresti <patl@lcs.mit.edu> added:
PGPに任意のファイルからパスフレーズを得させるために、ファンキーなシェル・リダイレクションも使える。変数を定義するための正確な命令はシェルによる。ksh などのようなものはexportPGPPASSFD=3 を使い、cshなどはsetenv PGPPASSFD 3 を使う。
setenv PGPPASSFD 3; pgp -eat file recipient 3 < /my/passphrase/file
この最後の例は、標準入力もユーザーが使えるという利点がある。たとえば、ある種の質問にはYes, Noで答えることができるのだ。
 

2.12 'randseed.bin'がウィルス感染したらどうしたらいいか?

'randseed.bin' ファイルは、PGPが新しいランダムなセッション鍵を生成するために使われる。その後、これは新しいランダムデータで満たされる。ウィルスチェッカーは、もちろんそのファイルが変更されたことを検出するだろう。そのファイルは"bin"拡張子がついているので、これは実行可能ファイルであるとほとんどの検出ソフトは判断し、そしてウィルスの可能性があると報告するだろう。

しかし、このファイルはPGPがいくつかのランダムデータを読むためだけにしか使われないので、実行不能である。つまり、あなたのウィルススキャンソフトの"除外"リストにいれるのが安全だ。そうすればスキップしてくれるだろう。2.6版のための選択として、 Randseed=C:\PGP\RANDOM.SRCをconfig.txtファイルに追加する手もある。これでランダム・ビットを格納するのに、'randseed.bin'ではなく、'random.src'ファイルを使うようPGPに命じるものである。

'randseed.bin'を削除しても何の問題もない。次に何かを暗号化するときに、いくつかランダムなキー入力を要求し、再びファイルを生成するだけのことである。

 

2.13 MacPGPはなぜ秘密鍵を見つけられないのか?

Zbigniew Fiedorowicz <fiedorow@math.ohio-state.edu> はこう説明する。
これは確かに、pgpニューズグループのFAQにもあるMIT MacPGP 2.6.2.の本当のバグである。MIT MacPGP 2.6.2 はなぜか、秘密鍵束を見つけることができても、あなたの秘密鍵が見つからないと言ってくる。これは、散発的に起こるかもしれない。その理由は、あなたがもし1セットを設定していたらユーザーID、そうでなければ空白文字列を示すと思われる未初期化ポインタにある。あいにく、空白文字の場合、それは初期化されず、RAMのランダム・エリアを示す。このエリアがNULLバイトで始まっていたら、すべてがうまくいき、MacPGPはsecring.pgpの最初の秘密鍵を使うだろう。しかし、そうでなければ、MIT MacPGPはあなたのユーザーIDがランダムながらくただと認識し、あなたの秘密鍵を見つけれないというのである。うまくいかせるには、config.txtを編集して、MyName = "秘密鍵の中の名前" を追加するといい。
 

2.14 TZ変数の設定法は?

TZ環境変数は、あなたのコンピューターの存在している時間帯を示す。これで、PGPはGMT(グリニッジ標準時)のためのタイムスタンプを生成することができ、別の時間帯の誰かが署名を調べて署名が未来のものだとか、別の正しくない時間だとかいう心配もなくなる。これはあなたのAUTOEXEC.BATファイル(DOS)か、CONFIG.SYSファイル(OS/2)で指定する。他のOSではマニュアルを参照のこと。

たいていの場合、以下のリストから設定を使えるだろう。

ロサンジェルス: SET TZ=PST8PDT
デンヴァー: SET TZ=MST7MDT
アリゾナ: SET TZ=MST7 (アリゾナは夏時間を使わない)
シカゴ: SET TZ=CST6CDT
ニューヨーク: SET TZ=EST5EDT
ロンドン: SET TZ=GMT0BST
アムステルダム: SET TZ=MET-1DST
モスクワ: SET TZ=MSK-3MSD
オークランド: SET TZ=NZT-12DST (訳注 日本: SET TZ=JST-9)

他の国のためには、TZの完全な形式が使われることになる。さらに公式には次のようになる。
SET TZ=SSS[+|-]nDDD,sm,sw,sd,st,em,ew,ed,et,shift
'SSS','n','DDD'は、短縮形の値である。長い形では、他の値が特定されなければならない。それは以下の通り。

'sm'は夏時間の開始月(1〜12)

'sw'は開始週(1〜4で月頭から、-1〜-4で月末から)。0はその月の特別な日が指定される。

'sd'は開始日('sw'がゼロでなければ0〜6[0が日曜日]、'sw'が0なら1〜31)

'st'は深夜から数えての開始時刻を秒数で(たとえば3600が01:00)

'em','ew','ed','et'は、夏時間の終わる時刻であり、同じ値をとる。

'shift'は夏時間でずれる時間を秒数で入れる(たとえば、夏時間に1時間が追加されるのであれば3600)。

たとえば、1995年の英国では、設定はこうなる。

SET TZ=GMT0BST,3,0,26,3600,10,0,22,3600,3600

 

2.15 PGPコマンドが働いたかどうかを知るには?

普通、PGPは「インタラクティヴ」モードで起動するから、何がどこで、また場合によってはなぜ、うまくいかないかを画面で常に読むことができる。しかし、PGPをバッチファイルやバックグラウンドで使いたいとき、命令がうまくいっているかどうかを知る必要があるだろう。このための一般的な方法は、PGPによって返された"exit code"を使うことである。

PGPが注文をやり遂げたかどうか調べることができるようにするには、コマンドラインに +batchmode オプションを付け加える必要がある(yesかnoかを選ぶよう尋ねられるプロンプトで「スタック」することを避けるために、 +force オプションもつけよう)。PGPは、すべてうまくいけば0を返してくるし、何かうまく行かなければ1を返してくる。

PGPソースには、関連したイベントが起こるときに返してくると思われるexit codeのリストがある。これは常に予期したようには動かないようだ。たとえば、PGPは、パスフレーズが復号化ファイルで特定できなかったときにはexit code 31を返してくるが、シグネチャをチェックしてみれば、「署名をチェックすべき鍵がありません」とか「悪い署名です」などのエラーを示すためにいつもexit code 1が使われている。

 

2.16 PGP 5.0はなぜもうランダムなキー入力を要求してこないのか?

ランダムな鍵入力はランダムなイベントを作り出すのに必要だったが、PGP 5.0はrandseed.binファイルを常にいつも更新し続けているシステムのイベントを使っている。これらのイベントは、ディスク・アクセス、キー入力、マウスの動き、その他の適切なランダムなものである。チェックするなら、PGPを使っていなくても、randseed.binの最終更新時刻がしばしば変わっていることがわかるだろう。

 

2.17 PGP 5.0/5.5とPGP 2.6.xは相互互換的か?

PGP 5.xはPGP 2.6.xの後継互換である。つまり、PGP 5.xはPGP 2.6.xで作られたものすべてを利用できる。RSA鍵がMD5ハッシュとIDEA暗号化で使われたときのみ、PGP 2.6.xはPGP 5.x出力を利用できる。RSA鍵のDSSかElGamalの証明書については、少々問題がある。PGP 2.6.xの鍵束チェック(-kc)は、いくつかの奇妙なエラーを報告する。PGP 2.6.3in は、この(どうでもいい)バグを修正してある。

アルゴリズムがMD5, RSA, IDAに限定されたとき、またそのときのみ、PGP 2.6.xとPGP 5.xは完全に相互互換的である。

 
[ 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ソースコード
暗号関係リンク集

叛乱オンライン