公開鍵暗号が実際にどう機能するか
非対称暗号、鍵ペア、デジタル署名の実践的な解説。数学的な類似のごまかしなし。
SSHでサーバーにアクセスするたびに、またはHTTPSサイトを読み込むたびに、数学的にリンクされた2つの鍵が重い処理を担っています。一方は公開鍵、もう一方は秘密鍵で、この2つの関係こそが、信頼できないネットワーク上での安全な通信を最初から可能にしています。
基本的な考え方
対称鍵暗号では、1つの鍵がデータを暗号化し、かつ復号化します。両者がすでに秘密を共有していれば機能しますが、その秘密を安全に配布することが難しいのです。公開鍵(非対称)暗号はこれを解決します。数学的に関連付けられた鍵ペアを生成し、公開鍵は誰にでも配布し、秘密鍵は決して共有しません。
公開鍵で暗号化されたデータは、対応する秘密鍵でしか復号化できません。秘密鍵で署名されたデータは、公開鍵を持つ誰もが検証できます。これら2つの性質がカバーするのは、ほぼ全ての用途です。機密性と認証です。
RSA、古典的な例
RSAは、2つの大きな素数を乗算するのは高速だが、その積を元の素数に因数分解するのは規模が大きいと計算的に大変という事実に依存しています。2048ビットのRSA鍵は、おおよそ1024ビットずつの2つの素数から構築されます。公開鍵は(n, e)です。nは素数の積、eは65537のような固定指数です。秘密鍵はnのオイラー関数を使って導出され、元の素数を知っていることが関わります。
暗号化はモジュラー指数化です。c = m^e mod n。復号化は秘密指数dで逆にします。m = c^d mod n。実際には、RSAで大きなペイロードを直接暗号化しているわけではありません。遅く、鍵長に紐付いたサイズ制限があります。代わりに、RSAは通常、対称セッション鍵(例えばAES-256)をラップし、対称暗号が大量のデータを処理します。これはTLSが使うハイブリッドアプローチです。
楕円曲線暗号とそれが主流になっている理由
ECCはRSAと同等のセキュリティを、はるかに小さい鍵で実現します。256ビットのECC鍵(secp256r1やCurve25519など)は、おおよそ3072ビットのRSA鍵と同等の強度です。小さい鍵はハンドシェイクが高速で、帯域幅が少なくなります。これが、モダンなTLS設定、SSH実装、SignalのプロトコルすべてがECCに依存している理由です。
数学は異なります。整数の因数分解ではなく、楕円曲線上の点に対する離散対数問題に基づいています。しかし、公開鍵と秘密鍵の関係、そして保証は概念的には同じです。
デジタル署名、等式のもう半分
暗号化はデータを機密にします。署名は真正性と完全性を証明します。メッセージに署名するには、それをハッシュ化し(通常SHA-256)、そのハッシュを秘密鍵で暗号化します。公開鍵を持つ誰もがメッセージをハッシュ化し、署名を復号化し、2つのハッシュが一致することを確認できます。
これはまさに、GPG鍵でgit commit -Sを実行するときに起こります。または認証局がTLS証明書に署名するときに起こります。CAの秘密鍵があなたの証明書に署名します。ブラウザはCAの公開鍵を事前に信頼できる状態で搭載しているため、CAと直接通信することなく、あなたの証明書の真正性を検証できます。
日常で見かける場所
SSH鍵認証は直接的な応用です。ssh-keygen -t ed25519は鍵ペアを生成し、公開側を~/.ssh/authorized_keysにサーバーに置き、秘密鍵を使ったチャレンジレスポンスで認証が発生します。パスワードは決して送信されません。
TLSハンドシェイクは非対称暗号をわずかの間だけ使用し、共有対称鍵を確立するためだけです(モダンなセットアップではECDHE鍵交換経由)。その後は高速な対称暗号に切り替わって、実際のセッションに入ります。PGP/GPGメール暗号化はハイブリッドパターンに従います。メッセージをランダムなAES鍵で暗号化し、そのAES鍵を受信者のRSAまたはECC公開鍵で暗号化します。
実際に壊れるもの
RSAとECCの背後にある数学は古典計算を通じて破られていません。問題は、ほぼ常に実装です。鍵を作成するときの弱いランダム数生成(2008年のDebian OpenSSLバグは教科書的な事例です)、ECDSA署名での再利用されたノンス(秘密鍵をリークする)、または不適切に実装されたRSAに対するパディングオラクル攻撃(PKCS#1 v1.5パディングに対するBleichenbacherの攻撃)。量子計算は長期的な理論上の脅威です。ShorのアルゴリズムはRSAとECCの両方を、十分に大きな量子コンピュータが存在すれば破ります。これがNISTが既にML-KEM(旧Kyber)のような耐量子アルゴリズムを将来の移行のために標準化した理由です。
これをさらに学びたければ、Korra Studioの暗号化コースは鍵交換プロトコルとハッシュ関数の内部をより深く扱い、ネットワーク関連セグメントはこれらがすべて実際のTLSハンドシェイクにどうフィットするかを1バイトずつ説明します。
この記事は AI の支援を受けて執筆し、Korra Studio の Michal Pilch(CISSP)が確認のうえ公開しました。
これは Korra Studio ナレッジベースの 1 つのノートです。プラットフォームはすべてのトピックと 1 対 1 メンタリングをペアで提供します。
無料で始めるarrow_forward