PGP再勉強で書いた分で,訂正です.
複数の鍵で暗号化
一つの暗号化ファイルを複数人で共有することについて,言い換えると「複数の利用者が(異なる鍵で)ファイルを復号できるような,単一のファイルを作る」という方法は,調べた限り,見つかりませんでした.
(略)
これがgpgでできないか,-rオプションで悪戦苦闘し,manpageも読んだものの,うまくいきませんでした.またGnuPG Frequently Asked Questionsの中にも,関係しそうなものが見当たりませんでした.それでちょっと考えてみたのですが,もしこれができると,誰か一人でも秘密鍵の漏洩があったら中身が知られてしまうことになり,そういう作りにはしたくないものです….
ということから,暗号化して複数人に知らせたい場合,別々にメールを送るか,その複数人が決まっているのなら,その人々の間で共有するようなメールアドレスとPGP用鍵ペアを作って共有するか,せざるを得ないのかなと思います.
「複数の利用者が(異なる鍵で)ファイルを復号できるような,単一のファイルを作る」ことは,できるとのこと.
データフォーマットは,RFC 4800,Section 5.1の出だしが関連しそうです.
5.1. Public-Key Encrypted Session Key Packets (Tag 1) A Public-Key Encrypted Session Key packet holds the session key used to encrypt a message. Zero or more Public-Key Encrypted Session Key packets and/or Symmetric-Key Encrypted Session Key packets may precede a Symmetrically Encrypted Data Packet, which holds an encrypted message. The message is encrypted with the session key, and the session key is itself encrypted and stored in the Encrypted Session Key packet(s). The Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted Session Key packet for each OpenPGP key to which the message is encrypted. The recipient of the message finds a session key that is encrypted to their public key, decrypts the session key, and then uses the session key to decrypt the message.
「Zero or more Public-Key Encrypted Session Key packets」と複数形で,セッション鍵による暗号文の前につけられる(may precede)ことが書かれています.また「The recipient」から始まる文の中に「a session key」とあって,「the session key」ではない点も,複数あってよいことを示唆しています.
それでちょっと考えてみたのですが,もしこれができると,誰か一人でも秘密鍵の漏洩があったら中身が知られてしまうことになり,そういう作りにはしたくないものです….
これについて,もう少し考えを進めてみました.
「複数の利用者が(異なる鍵で)ファイルを復号できるような,単一のファイル」を作り,何かあって,暗号化されていた中身が漏洩してしまったとします.そのとき,その複数の公開鍵に結びつけられた,少なくとも一つの秘密鍵が漏洩してしまった可能性が考えられます*1.どれなのかが分からなければ,安全のため受信者すべての鍵ペアを作り直したほうがいいのでしょうか….
なのですが,別々に暗号化して送った場合でも,同じような,秘密鍵の漏洩が真因であるとして,どこが原因か分からない情報漏洩が起こり得ることに気づきました.別々に送るメッセージに,発信者の署名をつけるにせよ,手作業で少し書き換えるにせよ,手の込んだステガノグラフィを取り入れるにせよ,漏洩を暴露する側はおそらく,得た情報すべてではなく,主要な一部分だけを,取得した根拠として挙げるでしょう.結局のところ,発信する情報に細工をする割には,流出元が見つかる可能性が上がるとは言い切れません.
暗号化された秘密鍵の漏洩
一方,PGPでは,復号の際,秘密鍵を使うためにパスワードを入力します.秘密鍵のパスワードは,秘密鍵の所有者ごとに設定し,あとで変更することも可能です*5.何らかの理由で秘密鍵の漏洩*6があったときは,それをもとに,鍵に結びつけられている過去の暗号メールが読まれてしまうことになりますが,その人が責を負うことになります.
*5:(略)そうすると,過去のメールは,過去に作った秘密鍵と新たに設定したパスワードを使って,復号することになります.
*6:~/.gnupg下の秘密鍵ファイルが流出したというのは,まあ解読される可能性もありますが,大きな被害とは言えません.秘密鍵を使うためのパスワードも知られてしまったという状況を指して「漏洩」としています.なお,そうなってからパスワードを変えるのは意味がなく,失効処理をして鍵サーバに送るなどして通知し,改めて,鍵を作り直す必要があります.
秘密鍵ファイルが流出した時点で,その秘密鍵で復号できる過去の暗号文は解読される可能性があり,今後のことを考えて,鍵ペアを作り直し,流出した分は失効扱いにしたほうがよいように,思えてきました.
全探索や辞書攻撃によって,暗号化された秘密鍵の解読,すなわち「暗号化された秘密鍵」から「秘密鍵」の取得が,本人や公開鍵サーバなどの知らないところで,なされてしまうのです.
ログイン用のパスワードなら,パスワードがばれた時点で,パスワードを変更すれば,古いパスワードでログインできなくなります.しかしPGPの場合,「新しいパスワードで暗号化された秘密鍵ファイル」も「古いパスワードで暗号化された秘密鍵ファイル」も,復号または解読をすれば,同じ秘密鍵情報となるという点で,事態はより深刻です.
そうすると,PGPは,暗号化zipよりもパスワードの管理が大変そうに思えてきます.暗号化zipの場合,そこにかけられているパスワードだけなのですが,PGPを使う場合は,秘密鍵に対する過去のパスワードにまで,気を配らないといけないので….
まあこれについては,暗号化された秘密鍵の情報,gpgのデフォルトだと~/.gnupgには注意しましょうねといったところですか.~/.sshと同様に.
*1:もちろん,発信者・受信者を含め,暗号化されていない状態のメッセージやファイルが漏洩した可能性も考えるべきです.