« ^ »

PGPとOpenPGPとGnuPGに対する理解を深める

所要時間: 約 10分

暗号化関連の話はただでさえややこしいが、PGP関連の話は更にややこしくなる。きちんと理解できている訳ではないけれど、少しずつ整理して理解を深める事にする。

ざっくりとした公開鍵暗号方式

暗号化の話をする時には大体アリスや、ボブが登場する1。それに合わせて、ここでもその登場人物を使う。

アリス
メッセージを送る人
ボブ
メッセージを受け取る人
イブ
メッセージを盗み見る人

アリスはボブにメッセージを送りたい。そしてイブは、そのメッセージを盗み見たいとする。そしてイブは、アリスはボブに伝えられる情報は見る事ができるとする。

アリスが平文でボブにメッセージを送った場合、もしイブがそのメッセージを見る事ができたら、イブはメッセージの中身を知る事ができる。

+-------------+                                 +-------------+
| Alice       |                                 | Bob         |
|             +-------------------------------->+             |
| "hello"     |  "hello" (plain text)           | "hello"     |
+-------------+        |                        +-------------+
                       |
                       |
                       |
                 +-----+-------+
                 | Eve         |
                 | "hello"     |
                 +-------------+

イブに見られても中身を知られないようにするにはメッセージを暗号化すれば良い。イブは暗号化した情報を見る事ができるけれど、それを暗号化する前のメッセージに戻す鍵を持っていないので、メッセージを知る事ができない。ボブはこの鍵を持っているため、受け取った情報を元のメッセージに戻す事ができる。

+-------------+                                 +-------------+
| Alice       |                                 | Bob         |
|             +-------------------------------->+             |
| "hello"     |  "khoor" (ciphertext text)      | "khoor"     |
|   |         |        |                        |   |         |
|   |<- Key:3 |        |                        |   |<- Key:3 |
|   |         |        |                        |   |         |
|   v         |        |                        |   v         |
| "khoor"     |        |                        | "khoor"     |
|             |        |                        |             |
+-------------+        |                        +-------------+
                       |
                 +-----+-------+
                 | Eve         |
                 | "khoor"     |
                 |   | <- ???? |
                 |   v         |
                 |  ????       |
                 +-------------+

ただし、暗号文を復号化するには鍵が必要になる。この鍵をアリスが作成した場合、ボブに知らせる必要がある。もしアリスがボブに鍵を知らせる情報をイブに見られてしまった場合、イブも情報を元のメッセージに戻す事ができる。それではこの鍵をどうやって、イブに知られる事なくボブに渡せば良いかという問題が出てくる。これは鍵配送問題と呼ばれる。

+-------------+                                 +-------------+
| Alice       |                    Key:3        | Bob         |
| Key:3 --+---+----------------------|--------->+----------+  |
|         |   |                      |          |          |  |
|         |   +-------------------------------->+          |  |
| "Hello" |   |  "khoor" (ciphertext text)      | "khoor"  |  |
|   |     |   |        |             |          |   |      |  |
|   |<----+   |        |             |          |   |<-----+  |
|   |         |        |             |          |   |         |
|   v         |        +-------------+          |   v         |
| "khoor"     |        |                        | "khoor"     |
|             |        |                        |             |
+-------------+        |                        +-------------+
                       |
                 +-----+-------+
                 | Eve         |
                 | "khoor"     |
                 |  |          |
                 |  |<- Key:3  |
                 |  v          |
                 | "hello"     |
                 +-------------+

鍵配送問題を解決するために公開鍵暗号方式が考えられた。公開鍵暗号では、暗号化する鍵と復号化する鍵が異なる。そのため、ボブに予め鍵対を作成してもらう。ボブは鍵を2つ作成し、一つを秘匿し(privkey)、もう一つをアリスに送る(pubkey)。この時アリスに送られた情報はイブも取得できるとする。

アリスは、ボブから受け取った鍵を使いメッセージを暗号化しボブに送る。ボブは秘匿した鍵を使い、情報を元のメッセージに戻す事ができる。イブは、ボブの秘匿している鍵を持っていないため、情報をメッセージに戻す事ができない。

+-------------+                                 +--------------+
| Alice       |           pubkey                | Bob          |
|          +--+<------------|-------------------+ pubkey       |
|          |  |             |                   | privkey      |
|          |  +-------------------------------->+              |
| "hello"  |  |  "khoor" (ciphertext text)      | "khoor"      |
|   |      v  |        |    |                   |   |          |
|   |<- pubkey|        |    |                   |   |<- privkey|
|   |         |        |    |                   |   |          |
|   v         |        +----+                   |   v          |
| "khoor"     |        |                        | "khoor"      |
|             |        |                        |              |
+-------------+        |                        +--------------+
                       |
                 +-----+-------+
                 | Eve         |
                 |      pubkey |
                 | "khoor" |   |
                 |  |      |   |
                 |  |<-----+   |
                 |  v          |
                 | ????        |
                 +-------------+

公開鍵暗号方式の大まかな流れはこんな感じだろう。

鍵対と公開鍵と私有鍵

公開鍵暗号方式では、暗号化に使用した鍵と、複合化に使用した鍵の2つを使っていた。この2つの鍵は鍵対と呼ばれる。通常、片方の鍵はWeb上に公開したりして誰でも取得できるようにする。この鍵は公開鍵と呼ばれる。もう一方の鍵は公開せず、誰にも取られないように大切に管理する。この鍵は私有鍵と呼ばれる。

公開鍵
public keyの事。
私有鍵
private keyの事。秘密鍵と訳す事もあるけれど「secret key」と混同しない為に私有鍵という言葉を使う2

その公開鍵は信用できるのか

公開鍵はその名の通り公開されている。その公開鍵を公開している人は、本当に本人だろうか。もし誰かになりすまして、公開鍵をWeb上に掲載していた場合、その公開鍵を使用してしまうと、その公開鍵を使って暗号化した情報は、なりすまし犯が復号化できる事になる。

そこで公開鍵が本当に信頼できる事を表す必要がある。この仕組みは公開鍵基盤と呼ばれ、いくつかの方式がある3。また公開鍵基盤によって採用している信頼モデルは異なる。

OpenPGPの場合、「信頼の輪」と呼ばれる信頼モデルが採用されている。これは個人がそれぞれの公開鍵を信頼しあい、信頼している人が信頼している公開は信頼できるとして、信頼のネットワークを構築していく。権威に頼ららない信頼モデルとなっている。とあるWeb記事では"友達の友達は友達"と表現されていた4

HTTPS等で使用されるX.509は、階層構造を持つ認証局を用いて信頼できる事を証明する。最上位の認証局が権威となって信頼を構築する。さしずめ"偉い人が良いと言ったら良い"と言った所だろうか。この点で仕組みが大きく異なる。

いろいろとすっ飛ばしてGnuPG

GnuPGはOpenPGPの実装の1つで、OpenPGPはPGP(Pretty Good Privacy)を標準化した仕様の事だ。暗号化関連はただでさえややこしいのに、ここにきてOpenPGPは、もう本当にややこしい。

PGP (Pretty Good Privacy)

PGP系暗号化ソフトウェアのオリジナル。現在はセマンティック社が権利を保有している。

当時反核活動家であったPhilip Zimmermannは、アメリカ合衆国当局の調査によって反核活動のメンバーリストを強引に奪われたことを受け、情報の暗号化の為に開発した。PGPを開発しインターネットで公開したことにより、PGPは人気を獲得し普及していった。PGP 2系になると、品質が格段に向上し、アメリカ合衆国政府が「兵器」とみなし、その危険性を危惧する程のものとなった。PGPはインターネット上で公開していたが、その結果「高度な暗号化ソフトウェアを海外に流出させた」として調査を受けることになった。そのためインターネット上でPGPを公開できなくなった。そこでPhilip Zimmermannは言論の自由を盾に出版物としてPGPのソースコードを出版した。それをベースにして開発されたPGPi(国際版PGP)が開発された。その後、法改正によりPGPは輸出可能な状態となった。それからPGPは商用化の道を模索するがあまり上手くいかなかった。

OpenPGP

PGPの仕様を標準化し、オープンな仕様としたもの。いくつかのRFCで構成される。公開鍵暗号方式の1つであるRSAの特許失効後に、PGPは有償になった。そこで自由なライセンスを持ったPGPを実装する目的としてIETFにOpenPGPワーキンググループが発足した。ワーキンググループは標準化の作業を進め、RFCを公開していった。

さまざなソフトウェアがOpenPGPに準拠する形で機能を実装している。

PGP

  • RFC 1991: PGP Message Exchange Formats

OpenPGP

  • RFC 2440: OpenPGP Message Format
  • RFC 4880: OpenPGP Message Format
  • RFC 5581: The Camellia Cipher in OpenPGP
  • RFC 6637: Elliptic Curve Cryptography (ECC) in OpenPGP
  • draft-ietf-openpgp-crypto-refresh OpenPGP Message Format

PGP/MIME

  • RFC 2015: MIME Security with Pretty Good Privacy (PGP)
  • RFC 3156: MIME Security with OpenPG

GnuPG (GNU Privacy Guard)

OpenPGPの仕様の標準化により、自由ソフトウェアとして実装したもの。

1997年4月にDiffie-Hellman米国特許4200770が、Hellman-Merkle特許(米国特許4218582)の特許の期限が切れた。これら2つは公開鍵暗号方式の基本的な部分をカバーしていた。GNUはそれまでPGPの自由な実装が必要だと考えてきたが、特許があったため実装を進められていなかった。特許が切れたことにより、それが実装が可能となった。

しかし特許は切れていても、アメリカ合衆国の武器売買法によってアメリカ合衆国国民は高度な暗号技術を有するソフトウェアの実装に制限を受ける状態は続いていた。そこでRMSはヨーロッパのハッカーに向けて公開鍵暗号のソフトウェアの開発を呼び掛けた。その呼び掛けに応じたハッカーが開発を開始し、数名が合流し開発が続けられた。そして1999年7月にgnupg-1.0.0がリリースさた。2004年にはgnupg-2.0.0がリリースされた。そして現在も開発が続いている。

主鍵と副鍵

OpenPGPには主鍵と副鍵の2種類の鍵対が使われる。

主鍵

通常、一人一つの主鍵を作成する。この鍵はその人がその人である事を表す。主鍵が異なるという事は、インターネット上では別人という事になる。もし何らかの理由で主鍵を失ってしまった場合、また新しい鍵を作成して始めなければならず、失った鍵を使っていた自分と、新しい鍵を使う自分は、インターネット上では別人として扱われる。つまり、主鍵を失うという事はインターネット上のアイデンティティを失うという事になる。

副鍵

主鍵は、失うとインターネット上のアイデンティティを失ってしまうため、普段に使う鍵として扱うには適していない。鍵を漏洩したら自分になりすませる誰かが存在するという事になるし、紛失したら自分を証明できなくなる。

そこで普段使用する鍵を作成し、主鍵は大切に保管する。この普段使用する鍵に副鍵を使う。副鍵は主鍵によって署名されている。そのため、副鍵の私有鍵を持つ人が、その副鍵を署名している主鍵の持ち主と同一である事を証明できる。

もし副鍵を漏洩したり紛失したら、副鍵を失効させ、主鍵から新たな副鍵を作る事ができる。その場合はインターネット上のアイデンティティを失わずにすむ。

主鍵と副鍵を分ける理由

ここまででも、なんとなく主鍵と副鍵を分ける理由が理解できたが、あらためてその理由をいくつかの記事を参考にしながらまとめてみる56

  • 主鍵をオフラインや安全なデバイスに保存する事で漏洩のリスクを下げる。
  • マシンが損傷する等して鍵を紛失した場合、それが副鍵であれば副鍵を失効し、新しい副鍵を生成できる。 これま主鍵だとアイデンティティを失う事になる。
  • ビルドサーバーのための署名用副鍵のように、用途に応じて鍵を生成する事ができる。 必要がなくなった場合、この鍵を使い回すのではなく失効させる事ができる。
  • 鍵の種類や鍵長によって処理の速度に影響を与える場合、普段使用する鍵は高速な種類や鍵長の副鍵を使い、主鍵は強度の強いアルゴリズムと鍵長を使う事ができる。
  • 一部のアルゴリズムでは、署名・暗号化・認証のすべてをサポートしていないため、副鍵として、用途に応じた鍵を生成する事ができる。
  • 他人には主鍵の指紋だけ伝えておけば、副鍵を作り直すことができる。

鍵束 (keyring)

公開鍵暗号を使用して情報をやり取りするには、互いに公開鍵を知っている必要がある。公開鍵を集めたものを鍵束と言う。GnuPGの鍵束は ~/.gnupg/pubring.kbx に保存されている。

見知らぬ公開鍵を鍵束に追加して良いのか?

信頼モデルの話の所でも記述したが、見知らぬ公開鍵は信頼できるかどうか判断できないため、鍵束に安易に追加するべきではない。信頼の輪の仕組みで、GnuPGではその鍵を信頼できるかどうかを計算する仕組みが実装されている。ただし、鍵が信頼できるからと言って、その鍵の持ち主が信頼できる訳ではない。

Rebooting the Web of Trust

信頼の輪を分散型の刷新する取り組みがあるようだ。

https://www.weboftrust.info/

主鍵の保管方法

主鍵の保管方法も人によって異なるらしい。調べて実施した内容を記載した。

/posts/1693552429/


1

https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AA%E3%82%B9%E3%81%A8%E3%83%9C%E3%83%96

2

https://mitome.in/email/keymanagement.html ではPrivate Keyは私有鍵と記していた。Secret Keyという言葉は、公開鍵暗号の鍵対の文脈ではあまり使われないけれど、混同を避ける為に言葉を分けているのだと思う。ここでは、それに倣う事にする。

3

X.509、Web of Trust等。