暗号化・安全な通信

公開鍵暗号方式

約 5 分で読めます

公開鍵暗号方式とは

公開鍵暗号方式 (Public Key Cryptography) は、暗号化と復号に異なる 2 つの鍵 (公開鍵と秘密鍵) を使用する暗号方式です。1976 年に Diffie と Hellman が概念を発表し、1977 年に RSA アルゴリズムとして実用化されました。

公開鍵は誰にでも公開でき、秘密鍵は所有者だけが保持します。公開鍵で暗号化したデータは対応する秘密鍵でしか復号できず、秘密鍵で署名したデータは対応する公開鍵で検証できます。この非対称性が、インターネット上で安全に通信するための基盤となっています。

TLS/SSLエンドツーエンド暗号化デジタル証明書、SSH、暗号通貨など、現代のセキュリティ技術の多くが公開鍵暗号方式に依存しています。

公開鍵暗号の 2 つの用途

公開鍵暗号方式には、大きく分けて 2 つの用途があります。

1. 暗号化 (機密性の確保)

送信者が受信者の公開鍵でデータを暗号化し、受信者が自分の秘密鍵で復号します。公開鍵は誰でも入手できるため、事前に秘密の鍵を共有する必要がありません。

実用例: 暗号化メール (PGP/GPG) では、受信者の公開鍵でメールを暗号化し、受信者だけが秘密鍵で復号できます。

2. デジタル署名 (真正性の確保)

送信者が自分の秘密鍵でデータに署名し、受信者が送信者の公開鍵で署名を検証します。署名が正しければ、データが改ざんされていないこと、確かにその送信者が作成したことが証明されます。

実用例: ソフトウェアの配布元がバイナリに署名し、ユーザーがダウンロード後に署名を検証することで、改ざんされていないことを確認できます。

主要なアルゴリズム

  • RSA: 最も広く使われてきたアルゴリズム。大きな素数の積の素因数分解が困難であることを安全性の根拠とする。鍵長は 2048 ビット以上が推奨。歴史が長く実績があるが、鍵が大きくなるため処理速度で不利。
  • 楕円曲線暗号 (ECC): 楕円曲線上の離散対数問題を安全性の根拠とする。RSA と同等の安全性を、はるかに短い鍵長 (256 ビット程度) で実現できる。TLS 1.3 では ECC ベースの鍵交換が標準。モバイルデバイスや IoT など、計算リソースが限られる環境で特に有利。
  • EdDSA (Ed25519): 楕円曲線暗号の一種で、署名の生成・検証が高速。SSH の鍵として広く採用されている。実装が比較的シンプルで、サイドチャネル攻撃への耐性も高い。

量子コンピュータが実用化されると、RSA や ECC は解読される可能性があります。これに備えた耐量子暗号 (Post-Quantum Cryptography) の標準化が NIST で進められており、2024 年に最初の標準が公開されました。

TLS での公開鍵暗号の使われ方

Web ブラウザで HTTPS サイトにアクセスするたびに、公開鍵暗号方式が使われています。ただし、すべてのデータを公開鍵暗号で暗号化するわけではありません。

  1. 鍵交換: TLS ハンドシェイクで、公開鍵暗号 (ECDHE など) を使って共通鍵を安全に交換する。
  2. サーバー認証: サーバーがデジタル証明書を提示し、秘密鍵で署名を行うことで、正当なサーバーであることを証明する。
  3. データ暗号化: 実際のデータ通信には、交換した共通鍵を使った共通鍵暗号 (AES など) を使用する。

公開鍵暗号は共通鍵暗号に比べて処理が数百倍遅いため、大量のデータ暗号化には向きません。TLS では「公開鍵暗号で共通鍵を安全に交換し、実際のデータは高速な共通鍵暗号で暗号化する」というハイブリッド方式を採用しています。

実用上の注意点と鍵管理

公開鍵暗号方式を安全に運用するには、アルゴリズムの選択だけでなく、鍵長の設定と鍵のライフサイクル管理が極めて重要です。

推奨鍵長: RSA は 2048 ビット以上が必須であり、2030 年以降の長期利用を想定する場合は 3072 ビット以上が推奨されます。ECDSA では P-256 (secp256r1) が標準的な選択肢で、RSA 3072 ビットと同等の安全性をはるかに短い鍵長で実現します。Ed25519 は署名用途で最も効率的であり、SSH 鍵として広く採用されています。1024 ビット以下の RSA 鍵は既に安全とみなされておらず、即座に更新が必要です。

鍵のローテーション: 秘密鍵は定期的に更新 (ローテーション) すべきです。デジタル証明書の有効期間は最長 398 日 (約 13 か月) に制限されており、証明書の更新に合わせて鍵ペアも再生成するのが望ましい運用です。自動化ツール (Let's Encrypt の certbot、AWS Certificate Manager など) を活用し、手動更新の漏れを防いでください。

証明書ピンニングのリスク: 特定の証明書や公開鍵をアプリケーションにハードコードする証明書ピンニングは、中間者攻撃への対策として有効ですが、鍵のローテーション時にアプリケーションの更新が間に合わないとサービス停止を引き起こします。Google Chrome は 2018 年に HPKP (HTTP Public Key Pinning) のサポートを廃止しており、現在は Certificate Transparency ログによる監視が推奨されています。

耐量子暗号 (Post-Quantum Cryptography): 量子コンピュータが実用化されると、Shor のアルゴリズムにより RSA と ECC は多項式時間で解読可能になります。NIST は 2024 年に耐量子暗号の最初の標準として ML-KEM (旧 CRYSTALS-Kyber)、ML-DSA (旧 CRYSTALS-Dilithium)、SLH-DSA (旧 SPHINCS+) を公開しました。現時点で量子コンピュータによる脅威は顕在化していませんが、「今暗号化されたデータを将来解読する」Harvest Now, Decrypt Later 攻撃に備え、長期保存が必要な機密データにはTLS のハイブリッド鍵交換 (従来の ECDHE + ML-KEM の併用) の導入検討を始めるべきです。

よくある誤解

公開鍵を公開すると危険
公開鍵は文字通り公開するための鍵です。公開鍵から秘密鍵を逆算することは計算上不可能 (現在の技術では) なので、公開鍵を広く配布しても安全性は損なわれません。秘密鍵の管理だけが重要です。
鍵長が長いほど常に良い
鍵長を長くすれば安全性は高まりますが、処理速度が低下します。RSA 2048 ビットと ECC 256 ビットは同等の安全性を持ちますが、ECC の方がはるかに高速です。アルゴリズムの選択と鍵長のバランスが重要です。

公開鍵暗号と共通鍵暗号の比較

公開鍵暗号 (非対称鍵)

暗号化と復号に異なる鍵を使用。事前の鍵共有が不要。処理速度は遅い。鍵交換やデジタル署名に使用。代表例: RSA、ECC。

共通鍵暗号 (対称鍵)

暗号化と復号に同じ鍵を使用。事前に安全な方法で鍵を共有する必要がある。処理速度は速い。大量データの暗号化に使用。代表例: AES。

関連用語

関連記事