はじめに
公開鍵暗号では、「公開してよい鍵」と「秘密にする鍵」を組み合わせます。名前だけを見ると、公開した鍵から秘密の情報を読み取られないのか、なぜ鍵を二つ使うのか疑問に感じるかもしれません。
公開鍵暗号は、互いに関連する公開鍵と秘密鍵を使い、暗号化、鍵の確立、電子署名などを行う仕組みです。ただし、公開鍵と秘密鍵の役割は用途によって異なり、すべてを「公開鍵で暗号化し、秘密鍵で復号する」と説明することはできません。
この記事では、公開鍵・秘密鍵・共通鍵の違い、安全な通信を始めるときの役割分担、電子署名での使い方を解説します。読み終えると、公開鍵暗号が何を担い、なぜ共通鍵暗号と組み合わせるのかを説明できるようになります。
公開鍵暗号とは
公開鍵暗号とは、数学的に関連する公開鍵と秘密鍵の組み合わせを使う暗号技術です。この二つを鍵ペアと呼びます。公開鍵は相手へ渡したり広く公開したりできますが、秘密鍵は鍵ペアの所有者が秘密に管理します。
適切な方式と鍵長を使う場合、公開鍵から対応する秘密鍵を現実的な計算量で求めることが困難になるよう設計されています。そのため、公開鍵を共有しても、秘密鍵までそのまま知られるわけではありません。ただし、安全性は公開鍵を隠すことではなく、標準的なアルゴリズム、適切な鍵、正しい実装と運用によって成り立ちます。
公開鍵暗号には複数の用途があります。方式によって、公開鍵はデータや鍵の暗号化、電子署名の検証、共有する秘密情報の計算などに使われます。対応する秘密鍵は、復号、署名値の生成、共有する秘密情報の計算などに使われます。
公開鍵・秘密鍵・共通鍵の違い
公開鍵と秘密鍵は、一つの公開鍵暗号方式で対になる鍵です。共通鍵はそれとは別に、通信する双方が同じ秘密の鍵を共有して使います。
| 鍵 | 公開できるか | 主な役割 | 管理上の注意 |
|---|---|---|---|
| 公開鍵 | 公開できる | データや鍵の暗号化、署名の検証、共有する秘密情報の計算など | 正しい相手の公開鍵か確認する |
| 秘密鍵 | 公開しない | 復号、署名値の生成、共有する秘密情報の計算など | 所有者だけが利用できるよう厳重に保護する |
| 共通鍵 | 通信相手以外へ公開しない | 同じ鍵でデータを暗号化・復号する | 利用する双方で安全に共有し、漏えいを防ぐ |
公開鍵と秘密鍵は、二者が同じ秘密鍵を共有する共通鍵暗号の鍵ではありません。公開鍵暗号の鍵ペアと、共通鍵暗号で共有する秘密の鍵は、目的も管理方法も異なります。暗号化と鍵の基本は「暗号化と復号とは?鍵を使ってデータを守る仕組みを解説」で解説しています。
公開鍵暗号で安全な通信を始める流れ
実際の通信では、公開鍵暗号だけで大量のデータを暗号化し続けるのではなく、共通鍵を安全に確立するために利用する構成が一般的です。代表的な流れは次のとおりです。
- サーバーや受信者が公開鍵と秘密鍵の鍵ペアを用意する
- 公開鍵を証明書などとともに相手へ提示する
- 相手が、公開鍵が意図した通信先のものか確認する
- 公開鍵暗号の仕組みを使って、双方だけが利用できる共通鍵を確立する
- 確立した共通鍵で、その後の通信データを暗号化する
共通鍵の確立方法には、相手の公開鍵で共通鍵を保護して渡す方法や、双方の鍵情報から同じ秘密情報を計算する方法などがあります。方式の詳細は異なりますが、公開鍵暗号が通信開始時の鍵確立を支え、共通鍵暗号が実際のデータを効率よく保護するという役割分担は、多くの実用的な構成に共通しています。
HTTPSで使われるTLSも、このような役割分担を利用する例です。ただし、公開鍵を受け取っただけでは相手が正しいとは限りません。証明書の検証などを通じて、公開鍵と通信先の対応を確認する必要があります。
電子署名では鍵の使い方が変わる
電子署名では、秘密鍵の所有者がデータに対する署名値を生成し、受信者が対応する公開鍵で署名を検証します。暗号化のように内容を秘密にするためではなく、対応する秘密鍵を使って署名値が生成されたことと、署名後にデータが変わっていないかを確認するために使います。ただし、その公開鍵が本当に署名者のものかを証明書などで確認できていることが前提です。
署名対象のデータは通常、ハッシュ関数とは?データ改ざん検出の仕組みを解説で得たハッシュ値と組み合わせて処理されます。ただし、ハッシュ値を作るだけでは署名者を確認できません。秘密鍵による署名と公開鍵による検証を組み合わせることで、電子署名としての確認が可能になります。
公開鍵暗号を「公開鍵で暗号化し、秘密鍵で復号する方式」だけだと考えると、電子署名の役割を説明できません。電子署名の詳しい仕組みは「電子署名とは?署名・検証の仕組みと改ざんを検出できる理由」で解説しています。
共通鍵暗号と組み合わせる理由
公開鍵暗号と共通鍵暗号は、どちらか一方を選べばよい競合関係ではありません。それぞれの長所を使い分けることで、安全性と処理効率を両立します。
| 比較項目 | 公開鍵暗号 | 共通鍵暗号 |
|---|---|---|
| 使用する鍵 | 関連する公開鍵と秘密鍵 | 双方が共有する同じ秘密鍵 |
| 鍵共有 | 事前に同じ秘密鍵を共有せず、公開鍵を使って鍵確立を支えられる | 利用前に秘密鍵を安全に共有する必要がある |
| 処理負荷 | 一般に大きい | 一般に小さく、大量データを処理しやすい |
| 主な役割 | 鍵確立、電子署名、特定のデータや鍵の暗号化 | 保存データや通信データの暗号化、メッセージ認証 |
公開鍵暗号を使っても、鍵に関する問題がすべてなくなるわけではありません。秘密鍵の保護に加え、受け取った公開鍵が本当に相手のものかを確認する必要があります。公開鍵暗号は、共通鍵を事前に手渡ししなくても通信に使う秘密情報を確立できるようにする一方で、公開鍵の信頼性を確認する仕組みを必要とします。
公開鍵暗号を安全に使うための基本
公開鍵は秘密にする必要がありませんが、誰の公開鍵かを確認せずに使用してはいけません。第三者の公開鍵へすり替えられると、その第三者と安全な通信を確立してしまう可能性があります。公開鍵証明書を利用する場合は、認証局の署名、証明書の有効期限、対象となる名前や識別情報などを標準機能で検証します。
秘密鍵は、鍵ペアの所有者だけが利用できるように保護します。ファイルとして安易に配布せず、アクセス権限を制限し、不要になった鍵は無効化または破棄します。秘密鍵が漏えいした場合は、対応する公開鍵や証明書を使い続けず、鍵の交換や証明書の失効などが必要です。
暗号機能は独自に実装せず、更新が継続されているOS、ライブラリ、通信プロトコルなどの標準機能を使用します。安全性は鍵を二つ使うだけで決まらず、アルゴリズム、鍵生成、乱数、証明書検証、秘密鍵保護を含む仕組み全体で確保します。
まとめ
公開鍵暗号は、関連する公開鍵と秘密鍵の鍵ペアを使う暗号技術です。公開鍵は共有できますが、秘密鍵は所有者が秘密に管理します。
公開鍵暗号では、用途によって鍵の役割が変わります。公開鍵暗号化では公開鍵で保護したデータや鍵を対応する秘密鍵で復号し、鍵確立では鍵ペアを使って共有する秘密情報を作ります。電子署名では秘密鍵で署名値を生成し、公開鍵で検証します。
実際の通信では、公開鍵暗号で共通鍵の確立を支え、その共通鍵でデータを効率よく暗号化する構成が一般的です。公開鍵の所有者確認、秘密鍵の保護、標準機能の利用まで含めて管理することが、安全に公開鍵暗号を使う基本です。