暗号的信頼と OpenPGP の解説

2026-02-18T19:57:27+08:00

この記事では、暗号学的信頼(cryptographic trust)、OpenPGP、それらの仕組みと重要性を説明します。

技術的背景:数学がどのようにして安全性とプライバシーを守るか

非対称暗号や OpenPGP の基礎となる数学的原理に関心がなく、単に暗号学的信頼を賢く使う方法だけ知りたい場合は、次の点を押さえておけば十分です:

実用的なガイダンスだけで良い場合、この節の残りは読み飛ばして構いません。

共通鍵(対称)暗号は、暗号化と復号に同じ鍵を使います。総当たり攻撃に対して安全になり得ますが、実務上の欠点があります。Alice と Bob が対称暗号でメッセージをやり取りする場合、まず共有鍵を安全に合意する必要があり、通常それには別の安全チャネル(例えば対面での確認)が要ります。これは不便であり、共有鍵が漏洩すれば機密性は失われます。

そこで非対称暗号の出番です。非対称暗号は暗号化と復号に異なる鍵を用いる——公開鍵と秘密鍵です。公開鍵は個人のウェブサイトやソーシャルメディアに公開できます。公開鍵から対応する秘密鍵を導出できないため、公開鍵を見られただけでは復号できません。秘密鍵は各自が厳重に保管します。

慎重に設計されたアルゴリズムは、公開鍵で暗号化したデータを対応する秘密鍵のみで復号できるように鍵ペアを生成します。RSA や楕円曲線暗号(ECC)などが例です。

RSA は最も古典的な非対称アルゴリズムの一つで、長い歴史を持ちます。RSA を理解すると非対称暗号の直感がつかめます。

簡潔に RSA の鍵生成を述べると、Alice はランダムに二つの互いに異なる素数 pq を選び、n = p * qΦ(n) = (p - 1) * (q - 1) を計算します。次に 1 < e < Φ(n) を満たし Φ(n) と互いに素な整数 e を選び、eΦ(n) による逆元を計算して d とします。Alice の公開鍵は (n, e)、秘密鍵は (n, d) です。Bob はメッセージ m を暗号化するために c = (m ** e) % n を計算して暗号文 c を Alice に送ります。Alice は m = (c ** d) % n で元のメッセージを復元します。

ここで疑問が生じます:公開鍵 (n, e) から d を計算できないのでしょうか?d を求めるには Φ(n) が必要で、Φ(n) を得るには pq を知らねばなりません。n から pq を復元するには n の因数分解が必要です。一般的な RSA 鍵長(例えば 4096 ビット)の n を因数分解することは現在の技術では極めて困難です。これが RSA の安全性の根拠です。

ECC や他のアルゴリズムは別の困難問題を使いますが、共通する核心は同じです:公開鍵から秘密鍵を求める計算が事実上困難であること。

eΦ(n) による逆元を計算する際には、最小の正の値を選びます。もし g = gcd(d, Φ(n)) > 1 であれば矛盾が生じます(e * d + k * Φ(n) = 1 が成り立つため)。したがって dΦ(n) と互いに素です。このことは ed が数学的に補完的であることを示していますが、実用では署名と暗号化の用途が明確に区別されます。

具体的には、RSA の署名はしばしば s = m ** d % n を計算し、検証は m == s ** e % n で行います。機密性と認証を同時に得たい場合、送信者はまず秘密鍵でメッセージに署名し、その署名済みデータを受信者の公開鍵で暗号化します。受信者は自分の秘密鍵で復号し、送信者の公開鍵で署名を検証します。

暗号学的信頼とは何か、なぜ重要か

監視や検閲は世界中の通信に影響を与えます。リスクの高い国だけでなく、欧州で提案されるような「チャット管理」的な政策も不安を広げています。XMPP、Matrix、SimpleX のようなエンドツーエンド暗号化をサポートする自由ソフトウェアのメッセンジャーを使えば、少なくともある程度は通信を監視や攻撃から守れます。非対称暗号は暗号化用と復号用の二つの鍵を生成し、一方の鍵で作られた暗号文はもう一方の鍵でのみ復号できるため、既存の安全チャネルがなくても連絡相手同士で安全な通信トンネルを確立できます。

しかし、別の問題が残ります。Alice と Bob が互いに安全に通信したいとき、双方が公钥を交換すればよいはずですが、中間者攻撃に遭う可能性があります。Mallory が Alice と Bob の公钥を入手し、それぞれに自分の公钥を送り付けた場合、Alice は Mallory の公钥を Bob のものと信じ、Bob は Mallory の公钥を Alice のものと信じてしまいます。Alice が署名して暗号化したメッセージを送ると、Mallory がそれを復号して読み取り(あるいは改変して)再署名し、Bob に転送します。Bob は Mallory の公開鍵で検証してしまい、誤ってメッセージが Alice から来たと信じます。こうして E2E の機密性と認証は破られます。

この問題を解くために、Alice は受け取った公钥が本当に Bob のものであることを確認する必要があります。この確認自体も信頼できるチャネルを要します(例えば対面確認)。公钥の所有者を検証するプロセスを確立することが、暗号学的信頼の構築です。

一度 Alice が Bob の鍵を信頼すれば、Mallory が Bob の秘密鍵を公钥から計算しない限り、Bob を偽装することはほぼ不可能です。

暗号学的信頼の核心原理:身元整合性の検証

上のシナリオは信頼構築の基本ケースです。多くの身元の間で大規模な信頼ネットワークを築くこともできますが、核心原理は単純です:既に信頼している別の身元と整合性が取れていることを確認することで、その身元に対する暗号学的信頼を確立します。

暗号の世界では、公鍵が身元に対応します。重要な点:公鍵 = 身元(鍵ベースの信頼の文脈において)。

身元整合性の検証は通常、次の二段階です:

例として、Alice がある公鍵の持ち主が本当に Bob であるかを検証したければ、本人に会って鍵のフィンガープリントを確認することができます。また、Alice は Bob に私鍵でテキストに署名させる(例えば「I am Bob」や Alice が生成したランダムなチャレンジ)こともできます。こうして Alice はその公開鍵に対して暗号学的信頼を確立します。

既に信頼された公開鍵(鍵 A)が Bob に属すると保証されているとします。別にある鍵 B が Bob に属すると期待され、Alice はそれを検証したい。この場合、再び Bob に会う必要はありません。鍵 A が既に信頼されているため、Alice は鍵 A と鍵 B の整合性のみを確認すればよい。これを実現する典型的な方法は:

このようにして A と B の整合性が確認され、鍵 B に対する信頼が成立します。

まずどの身元を信頼するか?

暗号学的信頼の確立過程は既に信頼された身元が前提です。しかし初めて会う人には信頼された身元がありません。最も一般的なアプローチは、最初に出会った身元を盲目的に信頼することです。これを ToFU(Trust On First Use) と呼び、最初に盲信される身元を initial identity と呼びます。

例えば、Alice と Bob が初対面なら、Alice が信頼する身元は生身の Bob です。Matrix のコミュニティで初めて接触した場合、初期信頼は Bob の Matrix アカウントとその公開鍵になります。XMPP で出会った場合、Alice は Bob の最初のメッセージに含まれる OMEMO フィンガープリントを信頼するかもしれません。

これは妥当な実践です。オンラインで知り合った友人と会う際、通常はその人を出会いに使った通信手段で確認するでしょう。

一般的な暗号学的信頼の実践

身元間の整合性を検証することで、Alice は頂点が身元、保証された整合性が辺である一つの グラフ を構築します。Bob の初期身元が属する連結成分の頂点はすべて Bob の信頼された身元です。

構築方法に応じたいくつかの一般的な実践:

  1. 非制限の信頼チェーン/ネットワーク。 任意の信頼された身元が未信頼の身元を検証して信頼を構築できる。ネットワークは自由に成長する。
    長所:便利で、接触途絶の可能性が最も小さい。
    短所:偽装に対する堅牢性が最も低い。初期身元から他の身元への信頼チェーンが長くなり得る。ある身元が破られれば多くの身元が同時に危険にさらされる。

  2. 初期身元中心。 未信頼の身元を検証して信頼を構築できるのは初期身元のみ。
    長所:初期身元が堅牢なら信頼は非常に堅固である。初期身元から他の身元への信頼チェーンの長さはすべて1になるため、ネットワークの攻破が難しい。
    短所:1) 初期身元が堅固でないか暗号学的でない場合、堅牢な信頼を構築できない。2) 単一障害点の問題:初期身元が破られればすべてが危険に晒される。

  3. 一意の暗号学的身元中心。 初期身元はまず一意の暗号学的身元(通常は鍵ペア)に対して信頼を確立し、その後はこの暗号学的身元だけが未信頼の身元を検証して信頼を構築する。これは私の信頼戦略で、OpenPGP を利用している。
    長所:中心身元の堅牢性と短い信頼チェーン長さの間でバランスが取れる可能性がある。
    短所:やはり単一障害点問題は存在する(1つが破られればすべてが破られる)。

一般的な身元検証法:Challenge–Response

Alice が既に Bob のある公鍵を信頼している場合、相手が本当に私鍵の保持者かを確認したいことがあります。このとき用いる簡単な方法が Challenge–Response です。

Challenge–Response は三段階で行います:

  1. Alice がランダム文字列(チャレンジ)を生成する。
  2. Alice がそのチャレンジを Bob に送り、Bob が私鍵でそのテキストに署名する。
  3. Bob は署名を返し、Alice は公開鍵で署名を検証する。

チャレンジは生成後に秘密にしておく必要はないが、予測不可能かつ一意であるべきだ。署名が有効なら、Alice は相手が Bob、即ち私鍵の保持者であることを確認できる。

暗号学的信頼の維持で非常に重要な点:私鍵を漏らさないこと!

暗号学的信頼の安全性と堅牢性は私鍵の安全性と機密性に基づく。私鍵を破られれば信頼は破綻する。

したがって、私鍵をなるべく漏らさないこと!一度私鍵が漏えいすれば、他者からの信頼は 有効でなくなる

特に OpenPGP を用いて信頼を管理する人は、OpenPGP の私鍵を最重要の秘密として扱ってください! 私鍵を Nitrokey、CanoKey、YubiKey といったハードウェアトークンに保管するのは良い習慣です。そうできない場合は、少なくとも 100% 自由ソフトウェアを実行するデバイスに私鍵を保管してください。

OpenPGP とその自由実装

OpenPGP はソフトウェアではなく標準仕様である。複数の原始的な鍵対をまとめて扱えるよう規格化し、暗号化・署名・認証などに利用できるようにする。OpenPGP は RSA、ECC など多様なアルゴリズムをサポートする。

GnuPG を例に使い方を示す:

  1. 鍵生成: gpg --full-generate-key を実行し指示に従う。
  2. 暗号化: gpg --encrypt を実行。標準入力に暗号化対象を渡せる(ファイルなら cat <filename> | gpg --encrypt)。出力は標準出力へ出る。デフォルトはバイナリなのでファイルにリダイレクトする。テキスト形式が欲しい場合は gpg --encrypt --armor を使う。
  3. テキスト署名: gpg --clear-sign。署名したいテキストを標準入力で渡し、終了時に Ctrl+D。署名済テキストは標準出力へ出る。
  4. 復号/検証: gpg --decrypt。暗号化または署名データを標準入力で与えると、復号されたデータが標準出力へ、検証結果は標準エラーへ出る。

GNU/Linux、*BSD、Windows、macOS では GnuPG が最も広く使われ、GUI フロントエンドとして Kleopatra がある。Android 向けには OpenKeychain が人気である。

詳細ガイドは本稿の範囲外であるため、該当ドキュメントや検索を参照してください。FSF の Email Self-Defense Guide は良い出発点です。さらに深く学ぶなら GnuPG の公式マニュアル、FSFE の OpenPGP ガイド、KDE の入門記事などを参照してください。

OpenPGP を用いてメールを暗号化する方法

Thunderbird のような自由ソフトウェアのメールクライアントは OpenPGP を内蔵している。OpenPGP により、暗号化、復号、署名検証をシームレスに行える。Mailvelope のようなブラウザ拡張は Web メールに OpenPGP を統合し、Web メール環境でも暗号化メールをより快適に利用できる。

各ツールのドキュメントを参照して具体的な方法を習得してください。

OpenPGP を使って暗号学的信頼を構築する方法

OpenPGP を用いた信頼構築はとても単純です:

  1. 相手の OpenPGP 公開鍵を求める。
  2. その鍵と相手の初期身元との整合性を検証する。これにより公鍵に対する信頼が成立する。
  3. 将来、相手の他の身元を検証する際は、OpenPGP 公開鍵とその身元の整合性を確認する。

最後に:自由ソフトウェアを受け入れ、賢く使おう

自由ソフトウェアコミュニティのおかげで、多くの堅牢なツールが存在する。それらの使い方を学ぶことで、私たちは安全性、プライバシー、その他のデジタル権利を守る力を得られ、様々な脅威、監視、検閲から自分たちを守ることができる。

Tildeverse Banner Exchange