わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

間違いだらけのPGP鍵管理

PGPなぜなにの次は,鍵管理です.
覚えていることを,箇条書きにしてみました.

  • 対称暗号でメッセージを暗号化する.そのための鍵(セッション鍵)はランダムに生成され,公開鍵暗号で暗号化されてメッセージに付随する.
    • 暗号化の概略は,セッション鍵の生成→公開鍵でセッション鍵を暗号化→平文を圧縮→セッション鍵で平文を暗号化→2つの暗号情報を連結(→必要ならテキスト化).
    • 復号の概略は,(必要ならバイナリ化→)暗号情報を分解→秘密鍵のパスワードを取得→パスワードから秘密鍵を復号→秘密鍵でセッション鍵を復号→セッション鍵で(平文に対する)暗号文を復号→伸張して平文を作成.秘密鍵はパスワード(パスフレーズ)をもとにした対称暗号で暗号化されているので,PGPの復号処理の中で3種類の復号が行われる.
  • ディジタル署名により,メール送信者の正真性を示すこともできる.「この署名を作ったのは,この秘密鍵が利用可能な人,すなわち自分だけである」というロジック.
  • 各ユーザはkeyringを持つ.keyringには,自分で作った鍵や,受け取った鍵が含まれる.鍵は公開鍵だけ,または公開鍵と秘密鍵のペアである.
    • keyringに鍵を入れることをimportという.importすることは,その鍵を(安全に)使うための必要条件であって十分条件ではない.
  • 各鍵は,1個以上*1のメールアドレスと結びつけられている.また鍵には32ビットの鍵IDがある.
    • 鍵は,ソフトウェアを実行すれば誰でも(誰のメールアドレスのものでも)生成可能である.技術的には,任意の鍵IDの鍵を作ることもできる.そのため,ある鍵IDに対して,(同一または異なるメールアドレスの)複数の鍵が存在し得る.
  • 「正当な鍵である」ことを鍵の所有者が主張し,その公開鍵の利用者がチェックするには,鍵ファイルを授受するだけでは不十分であり,正当性確認を行わなければならない.そこでfingerprintと呼ばれるハッシュ値の照合がよく行われる.同一の鍵ID,同一のメールアドレスであっても,fingerprintが合っていなければ,正当な鍵ではない
    • 悪意ある人が正答でない鍵ファイルを作って送りつけるといった形の「偽造」のほか,もともとは正当な鍵ファイルだけれど授受プロセスのどこかで値が変わったという「改竄」の可能性もある.
    • なお,鍵の生成などで,正当な鍵と1ビットたりとも違わない秘密鍵を別途作るというのは,適切な暗号アルゴリズムを採用するとともに鍵長を十分大きくとることで,その確率を無視できるほどに小さくできる.言い換えると,正当な秘密鍵の所有者以外に,1ビットたりとも違わない秘密鍵があるのなら,その鍵は漏洩されたのである.
    • fingerprintは160ビットで,通常は16進4文字を1語として10語で表現する.最後の2語が,鍵IDである.
    • fingerprintは公開しているところもある(例えばIPA/ISEC の PGP 公開鍵について:IPA 独立行政法人 情報処理推進機構).しかしHTTPで鍵もfingerprintもダウンロードするのでは,改竄の危険性がないとも限らない.それぞれの取得方法を別にすれば*2安全性は高まるが,その分,準備ややりとりが面倒になる.
  • 正当な鍵と認識したのち,その鍵で暗号化したり,署名の検証をしたりしようとするなら,その鍵に署名をする*3.その署名用の鍵は,自分の(秘密)鍵である.信頼度設定もできる.*4
  • 秘密鍵に対して,その失効(破棄)のためのファイルを作っておくことができる.そのファイルをimportしたら,そのkeyring内で,対応する鍵は失効(破棄扱い)となる.
  • 自分で作った鍵や,受け取って信頼度を設定した鍵の情報を,鍵サーバに送ることができる.逆に,他の人の鍵は,所有者から直接受け取るほかに,鍵サーバを検索して取得できるかもしれない.

*1:ちょうど1個ではないことは,組織内のあるantecessorさんの鍵から学んだ.gpgでは,【Proton.jp】 GnuPGの「秘密鍵にUSER IDを追加する方法」でできるとのこと.

*2:例えば,fingerprintを名刺に書いておく.

*3:必ずしも署名しなくても使える?

*4:4-4.鍵への署名 [[GnuPGのコマンド]]