概要
公開鍵暗号、鍵交換、デジタル署名が、それぞれどの役割で通信を守るのかを説明する。
共通鍵暗号では、通信する前に同じ鍵を安全に共有する必要があった。
公開鍵暗号は、暗号化に使う鍵と復号に使う鍵を分けることで、鍵配布の問題に新しい解決策を与えた。
この記事の構成
- 公開鍵暗号で変わった鍵の扱い
公開鍵暗号では、外部に公開してよい公開鍵と、本人だけが持つ秘密鍵を使用。 - Diffie-Hellman鍵交換
Diffie-Hellman鍵交換は、通信路上に共通鍵そのものを送らずに、双方が同じ共有秘密を作る方法。 - 素因数分解の難しさを使うRSA暗号
RSA暗号は、大きな整数の素因数分解が難しいことを利用した公開鍵暗号。 - ハイブリッド暗号
公開鍵暗号は鍵配布や鍵交換に便利だが、大量データの暗号化には共通鍵暗号の方が高速。 - デジタル署名
デジタル署名は、対応する秘密鍵で署名されたことと、署名後のデータに変更がないことを確認するために使用。 - 楕円曲線暗号(ECC: Elliptic Curve Cryptography)
楕円曲線暗号は、楕円曲線上の離散対数問題の難しさを利用する公開鍵暗号。
公開鍵暗号で変わった鍵の扱い
- 鍵を分ける発想
公開鍵暗号では、外部に公開してよい公開鍵と、本人だけが持つ秘密鍵を使う。
公開鍵で暗号化した情報は、対応する秘密鍵でしか復号できない。
これにより、送信者は受信者の公開鍵だけを知っていれば、受信者にだけ読める形で情報を送れる。 - 鍵配布問題の変化
共通鍵暗号では、通信する前に秘密の鍵を安全に渡す必要があった。
一方、公開鍵暗号では、公開鍵を広く配布できる。
もちろん、その公開鍵が本当に相手のものかを確認する仕組みは必要になるが、鍵配布の形は大きく変わった。
Diffie-Hellman鍵交換
- 共有鍵を直接送らない
Diffie-Hellman鍵交換は、通信路上に共通鍵そのものを送らずに、双方が同じ共有秘密を作る方法となる。
攻撃者が通信内容を見ていても、双方の秘密値を知らなければ共有秘密を求めにくい。
この考え方は、現在のTLSなどでも重要な役割を持つ。ただし、Diffie-Hellman鍵交換だけでは通信相手を認証できない。認証のない通信路では、攻撃者が双方の間に入り、それぞれと別の共有秘密を作る中間者攻撃を受ける可能性がある。
TLSなどでは、証明書やデジタル署名を使って鍵交換の相手を確認し、この問題へ対応する。図では、通信路に流れるのは公開値だけで、共有秘密 \(S\) は双方が手元で計算する点を見る。
- 前方秘匿性
一時的な鍵を使って毎回違う共有鍵を作ると、後で長期鍵が漏れても、過去の通信をすべて復号されにくくなる。
この性質を前方秘匿性という。
現代の安全な通信では、鍵交換の方式だけでなく、一時鍵を適切に使うことも重要になる。
素因数分解の難しさを使うRSA暗号
- 大きな数の性質を使う
RSA暗号は、大きな整数の素因数分解が難しいことを利用した公開鍵暗号となる。
RSAでは、公開鍵で暗号化したデータを秘密鍵で復号できる。
また、秘密鍵で署名を作り、公開鍵で検証する用途にも使われる。RSAは「公開鍵で包む操作」と「秘密鍵で開く操作」が分かれている。
背景には、大きな合成数から素因数を見つけるのが難しい、という数学的な前提がある。図では、公開鍵で暗号文 \(C\) を作り、対応する秘密鍵で元の平文 \(M\) に戻す流れを見る。
- 実用上の注意
RSAを安全に使うには、鍵長、パディング方式、乱数、実装上の対策が重要になる。
RSAの仕組みをそのまま単純に使うのではなく、標準化された安全な方式で扱う必要がある。
暗号の数学的な強さと、実装・運用の安全性は分けて考えると理解しやすい。
ハイブリッド暗号
- 公開鍵暗号と共通鍵暗号を組み合わせる
公開鍵暗号は鍵配布や鍵交換に便利だが、大量データの暗号化には共通鍵暗号の方が高速となる。
そのため実際の通信では、公開鍵暗号でセッション鍵を安全に共有し、その後の本文は共通鍵暗号で暗号化することが多い。
この組み合わせをハイブリッド暗号と考えると分かりやすい。実際の流れは、次のように分けると理解しやすい。
- 公開鍵暗号や鍵交換で、短期的に使うセッション鍵を共有。
- 共有したセッション鍵を使い、本文データを共通鍵暗号で暗号化。
- 通信中は、必要に応じてセッション鍵を更新。
役割 主に使う暗号 理由 セッション鍵の共有 公開鍵暗号・鍵交換 事前に同じ鍵を渡さなくても共有しやすい。 本文の暗号化 共通鍵暗号 大量データを高速に処理しやすい。
デジタル署名
- 暗号化とは目的が違う
デジタル署名は、内容を隠すためではなく、対応する秘密鍵で署名されたことと、署名後にデータが変更されていないことを確認するために使う。
送信者は秘密鍵で署名を作り、受信者は公開鍵で検証。
署名が正しく検証できれば、その公開鍵に対応する秘密鍵で署名されたこと、署名後にデータが変わっていないことを確認できる。
署名だけで現実の人物や組織まで特定できるわけではなく、公開鍵と本人・組織を結び付ける証明書や、別の信頼できる確認手段が必要となる。デジタル署名は、次のような手順で考えると分かりやすい。
- 送信者が文書からハッシュ値を作る。
- 送信者が秘密鍵で署名を作る。
- 受信者が同じ文書からハッシュ値を作る。
- 受信者が公開鍵で署名を検証。
確認できること 意味 署名鍵の確認 対応する秘密鍵で署名されたことを確認できる。 改ざん検知 署名後に文書が変わると検証に失敗。 - 電子証明書との関係
公開鍵を使うには、その公開鍵が本当に相手のものかを確認する必要がある。
そこで、認証局が公開鍵と主体情報を結び付けて署名したものが電子証明書となる。
WebサイトのHTTPSでは、この証明書を使ってサーバーの身元を確認。
楕円曲線暗号(ECC: Elliptic Curve Cryptography)
- 短い鍵で高い安全性を得やすい
楕円曲線暗号は、楕円曲線上の離散対数問題の難しさを利用する公開鍵暗号となる。
RSAと比べて短い鍵長で同程度の安全性を得やすいため、通信量や処理量を抑えたい場面で使われる。
ECDH(Elliptic Curve Diffie-Hellman)は鍵交換、ECDSA(Elliptic Curve Digital Signature Algorithm)やEdDSA(Edwards-curve Digital Signature Algorithm)はデジタル署名の用途で使われる。楕円曲線暗号では、基準点を秘密の回数だけ足して公開点を作る、という見方ができる。
公開点から「何回足したか」を戻すのが難しい点が、安全性の土台になる。図では、秘密鍵の値 \(d\) から公開点 \(Q\) を作る流れと、公開点 \(Q\) から \(d\) を戻しにくい点を見る。
- 現代通信との関係
現代のTLSでは、楕円曲線を使った一時的な鍵交換がよく使われる。
ただし、RSAやECCのような従来の公開鍵暗号は、大規模な量子コンピュータが実現した場合に危険になると考えられている。
そのため、後の耐量子暗号への移行が重要な課題になる。
まとめ
- 公開鍵で暗号化したデータは、対応する秘密鍵を持つ人だけが復号できる。
- 暗号化は内容の秘匿を目的とし、デジタル署名は対応する秘密鍵で署名されたことと改ざんの有無を確認する。公開鍵と本人・組織の結び付きは証明書などで確認する。
- RSAは暗号化や署名、Diffie-Hellmanは共有鍵を作る鍵交換に使われる。
- 実用通信では本文全体を公開鍵暗号で処理せず、共通鍵暗号と組み合わせるハイブリッド暗号が使われる。
- RSAやECCは広く使われてきたが、耐量子暗号への計画的な移行も必要になる。
参考文献
- CRYPTREC「CRYPTREC暗号の仕様書」(日本語・公的な暗号仕様一覧)
- Whitfield Diffie and Martin E. Hellman, New Directions in Cryptography(英語・公開鍵暗号の原論文)
- Ronald L. Rivest, Adi Shamir, and Leonard M. Adleman, A Method for Obtaining Digital Signatures and Public-Key Cryptosystems(英語・RSAの原論文)
- RFC 7748, Elliptic Curves for Security(英語・楕円曲線暗号の仕様原文)
- RFC 8446, The Transport Layer Security(TLS)Protocol Version 1.3(英語・TLS仕様原文)