非対称暗号とは
非対称暗号(Asymmetric Encryption)は、暗号化と復号化に異なる鍵(公開鍵と秘密鍵)を使用する暗号方式です。1976年にDiffieとHellmanによって概念が発表され、「鍵配送問題」を解決する画期的な技術として普及しました。
主な用途:
- 暗号化:公開鍵で暗号化、秘密鍵で復号化
- デジタル署名:秘密鍵で署名、公開鍵で検証
- 鍵交換:対称暗号の鍵を安全に共有
代表的なアルゴリズム
- RSA:素因数分解の困難性に基づく(1977年)
- 楕円曲線暗号(ECC):離散対数問題に基づく、短い鍵長で高セキュリティ
- Diffie-Hellman:鍵交換専用
- Ed25519:高速なデジタル署名
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等)で暗号化
- セッション鍵を公開鍵暗号で暗号化
- 暗号化されたデータとセッション鍵を送信
トラブル事例と対策
⚠️ 秘密鍵の漏洩
影響:過去のすべての通信が解読される可能性
対策:Perfect Forward Secrecyを使用し、セッションごとに鍵を生成。
2025〜2026年の最新動向
耐量子暗号(PQC)への移行
量子コンピュータの進歩により、RSAやECCは将来的に解読される可能性があります。NIST(米国標準技術研究所)は2024年、以下の耐量子暗号アルゴリズムを標準化しました。
- CRYSTALS-Kyber(ML-KEM):鍵カプセル化(鍵交換の代替)
- CRYSTALS-Dilithium(ML-DSA):デジタル署名
- SPHINCS+(SLH-DSA):ハッシュベースの署名
TLS 1.3では既に「ハイブリッドPQC」(従来のECDH + KEM)の試験実装が進んでいます。
"Harvest Now, Decrypt Later" 攻撃
現在の暗号化通信を収集しておき、将来の量子コンピュータで解読しようとする攻撃です。10年以上の機密性が必要なデータは既に耐量子暗号への移行を検討すべき段階です。
よくある質問(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が安全です。
