共通鍵暗号方式と公開鍵暗号方式について

こんにちは!ぐちです。

会社の後輩に質問され自信満々に教えてあげられなかったので整理を兼ねてご紹介します。

共通鍵暗号

これはいたってシンプルです。暗号化と復号に同じ鍵を使う方式です。
送信者が鍵[A]で暗号化したデータを受信者に送信して受信者は暗号化の時と同じ鍵[A]で復号します。

この場合、送信者と受信者とでデータ通信の前に鍵を共有しておくことが必要です。この時にネットワーク越しに鍵を送信して盗聴されてしまうと後の暗号化通信の際も復号されてしまうことになりますので、郵送などネットワーク越しではない送付方法を検討するのがいいとされています。

受信者と送信者でそれぞれ対になる共通の鍵を持つ必要があるので通信相手が増えればその分鍵数も増えていき管理が煩雑になります。

公開鍵暗号

この方式は暗号化と復号に異なる鍵を使います。受信者が公開鍵[A]と秘密鍵[A’]のペアを作り、公開鍵[A]を送信者に公開します。秘密鍵[A’]は誰にも知られないように受信者が適切に保管します。

ここで鍵の特徴として以下の2つがあげられます。

公開鍵で暗号化したデータはペアになる秘密鍵でのみ復号できる
秘密鍵で暗号化したデータはペアになる公開鍵でのみ復号できる

そして送信者は受信者の公開鍵[A]でデータを暗号化して送信します。暗号化されたデータを受け取った受信者は自身の秘密鍵[A’]で復号します。そうすることで通信経路上で暗号化されたデータが盗聴されても復号できるのは秘密鍵[A’]を持っている受信者のみですのでデータの内容が読み取られることはありません。

受信者は1つの公開鍵を公開するだけですので共通鍵暗号と比べて鍵の管理は煩雑になりません。現在の主流となっています。

電子署名への適用

送信者が間違いなく想定した本人であることを証明するために電子署名というものが使われます。送信者が公開鍵[A]と秘密鍵[A’]のペアを作り、受信者に公開鍵[A]を公開しておきます。秘密鍵[A’]は誰にも知られないように保管しておきます。

送信者は自身の秘密鍵[A’]でデータを暗号化して受信者へ送信します。受信者は送信者の公開鍵[A]で復号します。問題なく復号できれば、公開鍵[A]のペアとなる秘密鍵[A’]は適切な送信者しか知らないため、送信者本人からのデータであることが証明されます。

ただしこの方法だと暗号化対象のデータサイズが大きい場合に非常に処理コストが高くなる場合があります。電子署名の目的は送信者が本人であることを証明することでありデータ自体を秘匿したいわけではないので処理コストを低くする工夫がされています。

送信者はまずデータのハッシュ値を生成してそのハッシュ値を秘密鍵[A’]で暗号化します。平文のデータと暗号化されたハッシュ値を受信者に送信します。

受信者は公開鍵[A]で暗号化されたハッシュ値を復号したものと、平文のデータからハッシュ値を生成し2つのハッシュ値を照らし合わせます。その結果同じハッシュ値であれば送信者が適切な本人であることを確認することができます。

ハッシュ化すると元のデータサイズに関わらず固定サイズの復号不可な文字列が生成されます。それをハッシュ値と呼び、元のデータを暗号化するよりも暗号化処理のコストが低くすることができます。

電子署名には下記2つの特徴があります。

送信者が適切な本人であることを証明できる。
通信経路上でデータが改ざんされていないことを保証できる。

やっぱり複雑かも・・・

文章だけで書くと難しいですね。後輩にはホワイトボードを使いながら説明したので改めて図解したいと思います。

では今回はこの辺で。