非対称暗号とは
非対称暗号(Asymmetric Encryption)は、暗号化と復号化に異なる鍵(公開鍵と秘密鍵)を使用する暗号方式です。1976年にWhitfield DiffieとMartin Hellmanが論文「New Directions in Cryptography」で概念を発表し、それまで対称暗号(共通鍵暗号)が抱えていた「鍵配送問題」――暗号化前に安全な経路で鍵そのものを共有しなければならないという矛盾――を解決する画期的な発想として普及しました。翌1977年にはRon Rivest、Adi Shamir、Leonard Adlemanの3名がRSA暗号を考案し、これが最初の実用的な公開鍵暗号アルゴリズムとなっています。「公開鍵暗号(Public Key Cryptography)」という呼び方は、公開鍵を誰にでも配布できる点に由来し、「非対称」という呼び方は暗号化する鍵と復号化する鍵が異なる(対称ではない)ことに由来します。両方とも同じ技術を指す同義語として使われます。
主な用途:
- 暗号化:公開鍵で暗号化、秘密鍵で復号化(受信者だけが読める)
- デジタル署名:秘密鍵で署名、公開鍵で検証(送信者本人であることの証明と改ざん検知)
- 鍵交換:対称暗号(AES等)で使うセッション鍵を安全に共有する
- 認証:SSH公開鍵認証やクライアント証明書のように「秘密鍵を持っていること」を本人確認の根拠にする
仕組み・詳細解説
鍵ペアの生成と数学的な一方向性
非対称暗号の安全性は「一方向性関数(one-way function)」、つまり計算は簡単だが逆算は現実的な時間ではほぼ不可能な数学的問題に支えられています。RSAの場合、大きな2つの素数p、qの積である合成数n(=p×q)を求めるのは一瞬ですが、nだけを手がかりにp、qを逆算する「素因数分解問題」は、鍵長が十分大きければ現在のコンピュータでは天文学的な時間がかかります。楕円曲線暗号(ECC)では、楕円曲線上の点Pに対してスカラー倍kPを計算するのは高速な一方、結果からkを求める「楕円曲線離散対数問題(ECDLP)」が計算困難であることを利用しています。鍵ペアの生成には暗号論的に安全な擬似乱数生成器(CSPRNG)が不可欠で、LinuxではOSカーネルの/dev/urandom、Pythonのcryptographyライブラリでは内部的にOpenSSLの乱数生成器が使われます。乱数の質が低いと、2008年に発覚したDebian OpenSSLの乱数生成バグ(パッケージ改変により生成される鍵の種類が数万通りに縮退し、SSH鍵が推測可能になった事例)のような深刻な脆弱性につながるため、鍵生成ロジックを自前実装せず信頼できるライブラリ・OSの機能に任せるのが実務上の定石です。
暗号化・復号化・署名検証のプロセス
非対称暗号には用途に応じて2つの処理フローがあります。1つ目は「暗号化」で、送信者が受信者の公開鍵でデータを暗号化し、対応する秘密鍵を持つ受信者だけが復号できます。2つ目は「デジタル署名」で、送信者が自分の秘密鍵でデータ(実際にはSHA-256等でハッシュ化した値)に署名し、誰でも公開されている公開鍵を使って署名を検証できます。ここで重要なのは、教科書的なRSA計算(textbook RSA)をそのまま使うのは危険という点です。生のRSA演算は決定的(同じ平文は常に同じ暗号文になる)かつ悪意ある演算に対して脆弱なため、実運用では暗号化にOAEP(Optimal Asymmetric Encryption Padding)、署名にPSS(Probabilistic Signature Scheme)というパディング方式を組み合わせます。これらはRFC 8017(PKCS#1 v2.2)で規定されています。古いPKCS#1 v1.5パディングを暗号化に使い続けると、1998年にDaniel Bleichenbachが発見した「パディングオラクル攻撃」や、その現代版である2017〜2018年のROBOT攻撃のリスクが残るため、新規実装ではOAEP/PSSまたは後述のEd25519系アルゴリズムを選ぶべきです。
代表的なアルゴリズムの比較
非対称暗号にはいくつかの代表的なアルゴリズムがあり、数学的な前提や得意分野が異なります。
| アルゴリズム | 数学的基盤 | 主な用途 | 関連規格 |
|---|---|---|---|
| RSA(1977年) | 素因数分解の困難性 | 暗号化・署名(汎用) | RFC 8017 (PKCS#1) |
| ECDSA / ECDH | 楕円曲線離散対数問題 | 署名・鍵交換 | NIST FIPS 186-5, SP 800-186 |
| Diffie-Hellman(DH) | 離散対数問題 | 鍵交換専用 | RFC 7919 |
| Ed25519 / X25519 | Curve25519上のECC演算 | 署名(Ed25519)/鍵交換(X25519) | RFC 8032, RFC 7748 |
Ed25519やX25519はGoogleのCurve25519をベースにした比較的新しい方式で、実装のミスが起きにくい設計(定数時間演算がしやすい、鍵長が固定で扱いやすい)から、OpenSSH・Signal・WireGuardなど近年のプロトコルで標準的に採用されています。
鍵長とセキュリティレベルの目安(2026年時点)
鍵長はアルゴリズムによって「同じ安全性」を得るために必要な長さが大きく異なります。NISTのSP 800-57 Part 1が示す、対称暗号の鍵長に換算した「セキュリティ強度(ビット)」ごとの目安は次の通りです。
| セキュリティ強度 | RSA鍵長の目安 | ECC鍵長の目安 | 位置づけ |
|---|---|---|---|
| 112ビット | 2048ビット | 224〜255ビット(P-224) | レガシー互換用途に限定推奨 |
| 128ビット | 3072ビット | 256ビット(P-256/Ed25519/X25519) | 2026年時点の新規システム標準 |
| 192ビット | 7680ビット | 384ビット(P-384) | 高セキュリティ要件のシステム |
| 256ビット | 15360ビット | 521ビット(P-521) | 長期保護が必要な最高レベル用途 |
NISTはSP 800-131Aの移行方針の中で、112ビット相当(RSA-2048等)のアルゴリズムを2030年以降段階的に非推奨とし、それ以降は128ビット相当(RSA-3072またはECC-256)を最低ラインとする方向性を示しています。米国NSAが定めるCNSA 2.0(Commercial National Security Algorithm Suite 2.0)でも、国家安全保障システムに対して2033年前後を目安に耐量子暗号への移行を求めており、新規に鍵を発行する際はRSA-2048ではなくRSA-3072以上、またはECC(P-256以上)を選ぶのが2026年時点の実務的な標準といえます。
AIエンジニアとしての実体験
AIサービスのAPI認証やデータ暗号化で非対称暗号を活用しています:
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
# RSA鍵ペア生成
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
# 公開鍵で暗号化
ciphertext = public_key.encrypt(
b"secret message",
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# 秘密鍵で復号化
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
ハイブリッド暗号
非対称暗号は同じデータ量を扱う場合、対称暗号(AES等)に比べて処理コストが数百倍〜数千倍重いという弱点があります。そのため実際のTLS通信やPGPメールなどのシステムでは、両者の長所を組み合わせた「ハイブリッド暗号」を使用します:
- ランダムなセッション鍵(対称鍵、例:AES-256の鍵)を生成
- 実際に送りたいデータ本体を対称暗号(AES-GCM等)で高速に暗号化
- そのセッション鍵だけを相手の公開鍵暗号(RSAやECDHなど)で暗号化、または鍵交換で共有
- 暗号化されたデータ本体と、暗号化済みのセッション鍵(またはDHの公開値)をまとめて送信
TLS 1.3では鍵交換にECDHE(楕円曲線Diffie-Hellmanの一時鍵版)を使い、実際の通信内容はAES-GCMやChaCha20-Poly1305といったAEAD方式の対称暗号で暗号化するのが標準構成です。「E」(Ephemeral、一時的)が付くのは、通信のたびに使い捨ての鍵を生成することで後述のPerfect Forward Secrecyを実現するためです。
メリット・デメリット
| 観点 | メリット | デメリット・注意点 |
|---|---|---|
| 鍵の共有 | 事前に秘密の鍵を共有する必要がない(鍵配送問題を解決) | 公開鍵が本人のものである保証がなく、別途PKI(認証局)による検証が必要 |
| 鍵管理の規模 | n人が通信する場合、必要な鍵ペアはn組で済む(対称暗号ではn(n-1)/2組の共通鍵が必要) | 秘密鍵1つの漏洩がその鍵に紐づく全ての過去・未来のやり取りに波及しうる |
| 機能性 | 暗号化に加えてデジタル署名(否認防止・完全性検証・本人確認)を実現できる | 処理速度が対称暗号より大幅に遅く、大容量データの直接暗号化には不向き |
| 実装の複雑さ | 用途に応じて暗号化・署名・鍵交換を柔軟に組み合わせられる | パディング方式の選択ミス(PKCS#1 v1.5等)や乱数生成の不備が深刻な脆弱性に直結しやすい |
| 通信オーバーヘッド | - | 鍵長・署名長が対称暗号の鍵より大きく、IoTや低帯域環境では負荷になりやすい(ECCの採用理由の一つ) |
実務では「非対称暗号か対称暗号か」の二択ではなく、前述のハイブリッド暗号のように適材適所で組み合わせるのが定石です。非対称暗号は鍵交換と署名という「信頼の起点」を担い、実データの暗号化は高速な対称暗号に任せる、という役割分担を意識すると設計判断がぶれにくくなります。
混同されやすい用語・類似技術との違い
対称暗号(共通鍵暗号)との違い
最も混同されやすいのが対称暗号です。対称暗号(AES、ChaCha20等)は暗号化と復号化に同じ鍵を使うため高速ですが、通信前に鍵をどう安全に渡すかという「鍵配送問題」を抱えます。非対称暗号は異なる鍵ペアを使うことでこの問題を解決しますが、処理は重くなります。詳しくは対称暗号のページも参照してください。
デジタル署名との違い
デジタル署名は非対称暗号そのものではなく、非対称暗号を応用した「仕組みの一つ」です。暗号化では公開鍵で暗号化・秘密鍵で復号するのに対し、署名では逆に秘密鍵で署名(暗号化に相当する演算)を作り、公開鍵で検証(復号に相当する演算)します。「秘密鍵を持っている人にしか作れない」という性質を、暗号化では機密性の確保に、署名では本人性・改ざん検知の確保に使い分けている点が本質的な違いです。
PKI・デジタル証明書との違い
非対称暗号は「鍵ペアを使った数学的な暗号方式」そのものを指します。一方でPKI(公開鍵基盤)は、「その公開鍵が本当に名乗っている本人・組織のものか」を第三者の認証局(CA)が保証する社会的・制度的な仕組みです。X.509形式のデジタル証明書は、公開鍵と組織名・ドメイン名などの身元情報を紐づけ、認証局の署名で正当性を担保する電子文書です。非対称暗号は「技術」、PKI・証明書は「その技術を安全に運用するための信頼の枠組み」という関係にあります。
ハッシュ関数との違い
SHA-256などのハッシュ関数は鍵を一切使わず、任意長のデータを固定長の値に変換する一方向の処理で、そもそも「復号」という概念がありません。非対称暗号は公開鍵・秘密鍵という鍵のペアを使い、暗号化したデータは対応する鍵で復号できる点が根本的に異なります。実務ではデジタル署名を作る際に「まずハッシュ関数でデータを要約し、その要約値に非対称暗号で署名する」という形で両者を組み合わせて使うため、混同されがちですが別レイヤーの技術です。
トラブル事例と対策
秘密鍵の漏洩
影響:過去のすべての通信が解読される可能性がある。TLSの秘密鍵が漏れた場合、Perfect Forward Secrecyが有効でなければ過去に傍受・保存された暗号化通信も遡って復号されてしまう。
対策:Perfect Forward Secrecy(ECDHE等)を使用し、セッションごとに使い捨ての鍵を生成する。秘密鍵はHSM(ハードウェアセキュリティモジュール)やクラウドのKMSに保管し、平文でファイルシステムやリポジトリに置かない。
パディングオラクル攻撃(Bleichenbacher系)
影響:RSA暗号化に古いPKCS#1 v1.5パディングを使い、復号エラー時の応答内容やタイミングの違いをサーバがそのまま返してしまうと、攻撃者は繰り返しリクエストを送るだけで暗号文を少しずつ復号できてしまう。2017〜2018年に報告されたROBOT攻撃では、大手を含む複数のTLS実装がこの系統の脆弱性の影響を受けた。
対策:新規実装ではRSA暗号化にOAEP、署名にPSSを使用する(RFC 8017準拠)。可能であればRSAの直接暗号化利用自体を避け、ECDHEによる鍵交換とAEAD対称暗号を組み合わせる構成に寄せる。
弱い乱数生成による鍵の予測
影響:鍵ペア生成時の乱数源に偏りがあると、理論上は膨大な組み合わせを持つはずの秘密鍵が実際には少数のパターンに縮退し、総当たりで推測される危険がある。2008年に発覚したDebian OpenSSLの乱数生成バグはその代表例で、影響を受けたSSH鍵・SSL証明書は業界規模での再発行を余儀なくされた。
対策:鍵生成をOS標準のCSPRNGや十分にレビューされたライブラリ(OpenSSL、Pythonのcryptography等)に任せ、独自の乱数処理を書かない。証明書や鍵の定期的なローテーションも被害範囲を限定する上で有効。
2025〜2026年の最新動向
耐量子暗号(PQC)への移行
量子コンピュータの進歩により、RSAやECCは将来的に解読される可能性があります。NIST(米国標準技術研究所)は2024年、以下の耐量子暗号アルゴリズムを標準化しました。
- CRYSTALS-Kyber(ML-KEM):鍵カプセル化(鍵交換の代替)
- CRYSTALS-Dilithium(ML-DSA):デジタル署名
- SPHINCS+(SLH-DSA):ハッシュベースの署名
TLS 1.3では既に「ハイブリッドPQC」(従来のECDH鍵交換とKEMを併用する方式、例:X25519MLKEM768)の実装が主要ブラウザ・CDNで進んでおり、Chromeやいくつかの大手CDN事業者はデフォルトで有効化を始めています。国内ではCRYPTREC(電子政府推奨暗号リスト)も耐量子暗号の動向を継続的に追跡しており、当面はRSA・ECCとPQCアルゴリズムを併用する移行期が続く見込みです。
"Harvest Now, Decrypt Later" 攻撃
現在の暗号化通信を収集しておき、将来の量子コンピュータで解読しようとする攻撃です。10年以上の機密性が必要なデータ(医療記録、国家機密、長期契約情報など)は既に耐量子暗号への移行を検討すべき段階とされています。
Ed25519/X25519の普及拡大
OpenSSHは2014年以降Ed25519鍵をサポートし、近年はRSA鍵よりもEd25519鍵の生成をデフォルトで推奨する運用が広がっています。Signal、WireGuard、Age(ファイル暗号化ツール)などモダンな実装もCurve25519系を採用しており、実装の単純さと定数時間演算のしやすさからサイドチャネル攻撃のリスクを下げやすい点が評価されています。新規に鍵を発行する場面では、後方互換性の制約がない限りRSAよりEd25519/X25519を第一候補にするのが2026年時点の実務的な傾向です。
よくある質問(FAQ)
Q. 非対称暗号(公開鍵暗号)とは何ですか?
暗号化と復号化に異なる鍵(公開鍵と秘密鍵)を使用する暗号方式です。公開鍵は誰でも入手でき、秘密鍵は本人のみが保持します。TLS/HTTPS、SSH、デジタル署名の基盤技術です。
Q. RSAとECCはどちらを使うべきですか?
新規システムでは、より短い鍵長で高いセキュリティを提供するECC(特にP-256やEd25519)を推奨します。RSA-2048は後方互換性が必要な場合に使用します。将来を見越すならNISTが2024年に標準化した耐量子暗号(CRYSTALS-Kyber等)の導入も検討してください。
Q. Pythonで非対称暗号を使う最良の方法は?
cryptographyライブラリ(pip install cryptography)が最も推奨されます。RSAより楕円曲線(Ed25519)を使う方が現代的で安全です。古いPyCryptoやPyCryptodomeよりもcryptographyパッケージの方がAPIが安全です。
Q. 非対称暗号のメリット・デメリットは?
最大のメリットは、事前に秘密の鍵を共有しなくてよい点(鍵配送問題の解決)と、暗号化だけでなくデジタル署名による本人確認・改ざん検知が実現できる点です。一方でデメリットは、対称暗号に比べて処理速度が大幅に遅いこと、鍵長や署名長が大きく通信オーバーヘッドになりやすいこと、公開鍵が本人のものだと保証するために別途PKI(認証局)の運用が必要になることです。実務では対称暗号と組み合わせたハイブリッド暗号で弱点を補うのが一般的です。
Q. 非対称暗号とPKI(デジタル証明書)はどう違いますか?
非対称暗号は公開鍵・秘密鍵のペアを使う暗号方式そのものを指す技術用語です。これに対しPKIは、その公開鍵が本当に名乗っている本人・組織のものかを認証局(CA)が第三者として保証する制度的な仕組みで、X.509形式のデジタル証明書はその保証結果を記録した電子文書です。非対称暗号は「鍵の仕組み」、PKIは「その鍵を信頼するための枠組み」という関係にあり、TLS通信では両方が組み合わさって初めて安全な通信が成立します。
関連用語
外部リンク・参考資料
公式資料・標準規格:
- NIST - Post-Quantum Cryptography標準化プロジェクト(耐量子暗号アルゴリズムの標準化状況)
- NIST SP 800-57 Part 1 Rev.5(鍵管理と鍵長・セキュリティ強度の推奨指針)
- RFC 8017 - PKCS #1: RSA Cryptography Specifications Version 2.2(RSAのOAEP/PSSパディング仕様)
- CRYPTREC(電子政府推奨暗号リスト)(日本国内における暗号アルゴリズムの評価・推奨)
- Cloudflare Blog - Post-Quantum Cryptography for All(PQC移行の実運用事例)
