公開鍵暗号の基本:安全な共有の仕組み
公開鍵暗号の基本と安全なファイル共有を可能にする仕組みを解説。RSA・Diffie-Hellman・最新の鍵交換。
公開鍵暗号(非対称暗号とも呼ばれます)は、数学的に結びついた2つの鍵を使います。自由に配布できる公開鍵と、厳重に管理する秘密鍵です。私の公開鍵で暗号化したものは、私の秘密鍵でしか読めません。これは暗号論上の最も古い問題、すなわち「一度も会ったことのない2者が公開チャネル上で秘密を共有する方法」を解決します。1976年に Diffie と Hellman が発明し、翌年 RSA が実用化したこの技術は、現在では TLS 1.3、 Signal 、 SSH 、 Ed25519 コード署名、ユーザー認証を行うすべてのファイル転送サービスの基盤となっています。
数学的なトラップドア
すべての公開鍵暗号は「トラップドア」関数に依存しています。順方向には簡単に計算できますが、追加情報なしに逆算することは事実上不可能な計算です。2つの大きなファミリーが主流を占めています。
素因数分解(RSA):大きな2つの素数を掛け算するのは簡単ですが、その積を因数分解するのは指数関数的に困難です。2048ビットの RSA 鍵は2つの約1024ビットの素数を使います。最善の攻撃手法である General Number Field Sieve でも約2^112の操作が必要で、現実的に不可能です。
楕円曲線上の離散対数(ECDH、ECDSA、Ed25519):曲線上の点乗算は高速ですが、乗数を求める逆算は困難です。 Curve25519 などの256ビット曲線は3072ビット RSA に相当するセキュリティを提供します。
どちらの問題も、量子コンピュータが Shor のアルゴリズムで容易に解けるため、NIST は2024年に FIPS 203〜205 でポスト量子暗号の代替標準(ML-KEM と ML-DSA)を制定しました。
RSA の実際
Ron Rivest 、 Adi Shamir 、 Leonard Adleman が1977年に発表した RSA は洗練されたスキームです。概略は次のとおりです。2つの大きな素数 p と q を選びます。n = p × q(モジュラス)と φ(n) = (p-1)(q-1) を計算します。φ(n) と互いに素な e(通常65537)を選びます。e × d ≡ 1 (mod φ(n)) となる d を計算します。公開鍵は (n, e)、秘密鍵は (n, d) です。
現実の RSA は選択暗号文攻撃を防ぐために OAEP パディング(RFC 8017)を使います。教科書的な RSA は致命的に安全ではありません。新しいシステムには RSA-2048 が最低限で、長期的に使うものには RSA-3072 または4096 を推奨します。
Diffie-Hellman:鍵を送らずに共有秘密を作る
RSA は既知の受信者への暗号化を可能にします。 Diffie-Hellman は微妙に異なることを実現します。2つの当事者が公開チャネル上で、秘密を一度も送信することなく共有秘密を導出できます。
古典的な手順です。両者が大きな素数 p とジェネレータ g に合意します。 Alice は秘密 a を選び A = g^a mod p を送ります。 Bob は秘密 b を選び B = g^b mod p を送ります。 Alice は B^a mod p = g^(ab) mod p を計算します。 Bob は A^b mod p = g^(ab) mod p を計算します。盗聴者は g、p、A、B を見ますが、A と B から g^ab を計算するには離散対数問題を解く必要があります。
現代の DH は楕円曲線(ECDH)を使います。 X25519 が標準的な選択肢で、32バイトの鍵と32バイトの共有秘密を持ち、タイミング攻撃に対して実装上強化されています。
楕円曲線が主流になった理由
RSA が古く感じられるのは実際に古いためです。楕円曲線暗号が RSA に取って代わった実用的な理由が3つあります。
鍵が小さい:256ビットの EC 鍵は3072ビットの RSA 鍵と同等のセキュリティを持ちます。32バイト対384バイトです。
演算が速い:現代的な CPU での Curve25519 上の ECDH は約70マイクロ秒です。RSA-3072 の鍵生成は秒単位かかります。
ランダム性耐性が高い: Ed25519 は決定論的です。署名にメッセージごとのランダムなノンスが不要なため、定数ノンスがマスター鍵を漏洩した2010年の Sony PS3 ECDSA 事件のような問題を回避できます。
NIST 曲線(P-256、P-384、P-521)は広くサポートされていますが、一部の暗号研究者が説明のない定数を疑問視してきました。 Daniel Bernstein が設計した Curve25519 と Ed25519 は TLS 1.3、 WireGuard 、 Signal 、SSH で使われる現代的なデフォルトです。
署名:誰が送ったかを証明する
公開鍵暗号には対称暗号にはできないことがあります。それは送信者を証明することです。署名は暗号化の役割を逆にします。秘密鍵で「暗号化」(署名)し、公開鍵を持つ誰もが「復号」(検証)できます。検証できるなら、送信者は秘密鍵を持っていたはずです。
実際の署名はハッシュ関数を使って任意サイズのメッセージを処理します。SHA-256(message) を計算し、秘密鍵で署名(RSA-PSS、ECDSA、または Ed25519)します。検証者は受け取ったメッセージをハッシュし、公開鍵で署名と照合します。
応用例として、TLS 証明書(CA がサイトの公開鍵に署名)、コード署名( Apple のノータリゼーション、 Microsoft Authenticode)、 Git コミット署名、ソフトウェアパッケージマネージャー(apt、 Homebrew 、npm)があります。
ファイル転送での公開鍵暗号の使われ方
匿名リンクベースの転送( SwissTransfer 、 HexaTransfer )では、公開鍵暗号が直接登場しないことが多く、URL フラグメントのランダムな対称鍵ですべてを処理します。ただしアカウントベースのサービスでは公開鍵が重要です。
TLS 1.3 サーバー認証では、すべての HTTPS 接続がサーバーの証明書から始まり、CA チェーンで検証されます。その後、一時的な ECDHE 鍵交換でセッション鍵を導出します。アカウント間暗号化では、 Tresorit 、 Proton Drive 、 Mega はサインアップ時にユーザーに鍵ペアを付与し、アカウント間で共有するファイルを受信者の公開鍵でラップします。パスワードレス認証では、 WebAuthn とパスキーがセキュアなハードウェア( Touch ID 、 Windows Hello 、 YubiKey )に保存された EC 鍵を使います。
鍵の配布:残る難題
公開鍵暗号は一つの鍵配布問題を解きますが、別の問題を生みます。ある公開鍵が主張する人物のものであることを、どうやって確認するかです。3つのモデルがあります。
PKI(公開鍵インフラ):証明機関が公開鍵に署名します。 Chrome 、 Firefox 、 Safari にルートが組み込まれた TLS で使われます。
信頼の輪:PGP のアプローチ。ユーザーが互いの鍵に署名します。柔軟ですがスケールの問題で採用は限定的でした。
TOFU(Trust On First Use):SSH のアプローチ。初回は鍵を信頼し、変更があれば警告します。シンプルですが初回傍受に脆弱です。
鍵の透明性:すべての公開鍵を公に監査可能にするマークルツリーログ。 WhatsApp 、 iMessage Contact Key Verification 、現代のパスキーシステムで使われます。
見知らぬ受信者とのファイル転送では、URL フラグメント共有がこれを完全に回避します。送信者はリンク経由で受信者に鍵を直接渡し、真正性はリンクを共有したチャネルに依存します。
量子コンピュータが変えること
大規模な量子コンピュータが Shor のアルゴリズムを実行すると、RSA も楕円曲線暗号も破られます。現在の推計では10〜20年後とされていますが、長い保存期間を持つデータにとってリスクはすでに現実です。「今収集して、後で復号する」攻撃は、現在の暗号化通信を記録しておき2040年に復号します。
NIST の2024年ポスト量子標準は次のとおりです。FIPS 203(ML-KEM)が Diffie-Hellman / ECDH を鍵交換で置き換えます(格子問題に基づく)。FIPS 204(ML-DSA)が RSA/ECDSA を署名で置き換えます。FIPS 205(SLH-DSA)がハッシュベースの署名バックアップです。
Cloudflare と Google はすでに TLS 1.3 鍵交換で ML-KEM をサポートしています。対称暗号化(AES-256-GCM)への影響は限定的で、 Grover のアルゴリズムは有効鍵長を半分にするだけです。
まとめ:現在の安全な共有
機密共有の今のベストプラクティスは次のとおりです。TLS 1.3 と X25519 鍵交換で接続を保護し、AES-256-GCM でバルク暗号化を行います。アカウントベースのサービスでは、ECDH with Curve25519 でファイルごとの鍵をラップします。リンクベースのサービスはアカウント層を省いてシンプルさを得ます。どちらも正しく実装されれば強力なセキュリティを提供します。
hexatransfer.comでお試しください — 無料、登録不要、最大10GB。
エンドツーエンド暗号化で大容量ファイルを安全に送信
エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。
ファイルを送信