2015/06/10

共通鍵暗号と公開鍵暗号の仕組み


暗号理論の基礎的な概念である「共通鍵暗号方式」と「公開鍵暗号方式」について解説します。

共通鍵暗号方式

共通鍵暗号方式:暗号化に必要な鍵と復号化に必要な鍵が同じであるような暗号方式

直感的にも分かりやすい自然な方法です。「鍵」を「数字」と読みかえてもOKです。

〜メッセージを送る側〜
送りたいメッセージ:$m$
暗号化に用いる鍵:$k$
送信者:$m$ と $k$ をもとに暗号文 $f(m,k)$ を作成して送る

〜受け取る側〜
複号に用いる鍵:$k$
受信者:$f(m,k)$ と $k$ をもとに暗号文を解読してもとのメッセージを得る

〜防御性能〜
$f(m,k)$ がバレても共通鍵 $k$ がバレなければ複号はできない

やりとりする二人はあらかじめ「 $2960$ を鍵にしよう。また,メッセージ+鍵を暗号文として送ろう」という約束を決めておく。

送る側

メッセージ:$1192$,鍵:$2960$ →暗号文 $4152$ を送る

受け取る側

受信したもの:$4152$,鍵:$2960$ → $1192$ が復元できる

悪いやつが $4152$ を盗み見ても鍵がないと $1192$ を復元できない。

共通鍵暗号の問題点

共通鍵暗号の場合,あらかじめ送信者と受信者で共通鍵を共有しておく必要があります。

悪いやつに盗み見られても復号できないために暗号化を用いるのに,あらかじめ他人にバレないように共通鍵を共有するという行為が矛盾しているのです。

さっきの例:共通鍵 $2960$ を安全に(他人にバレないように)共有できる方法があるなら伝えたいメッセージ $1192$ もその方法で送ればよい!

共通鍵暗号は意味がない訳ではありません。最初の1回(共通鍵の共有)さえなんとかすればあとは気を抜いても大丈夫だからです。ただ,できれば共通鍵の共有という最初の危険な(バレるとやばい)操作もやりたくないわけです。

公開鍵暗号方式

共通鍵暗号方式の問題を解消してくれるのが公開鍵暗号方式です。

公開鍵暗号方式:暗号化に必要な鍵と復号化に必要な鍵が異なるような暗号方式

1:受信者の準備
暗号化に用いる鍵(公開鍵):$k_1$(僕に暗号文を送りたいときは $k_1$ を使ってね!と全世界に公開する)
複号に用いる鍵(秘密鍵):$k_2$(自分以外には一切伝えない)
を用意しておく。

2:送信者が暗号化
送りたいメッセージ:$m$
暗号化に用いる鍵:$k_1$(公開されているので使える)
$m$ と $k_1$ をもとに暗号文 $f(m,k_1)$ を作成して送る

3:受信者が復号
受け取ったメッセージ $f(m,k_1)$ と秘密鍵 $k_2$ からもとのメッセージ $m$ を復号

〜防御性能〜
$f(m,k_1)$ がバレても秘密鍵 $k_2$ がバレなければ複号はできない!秘密鍵は受信者しか知らず,あらかじめ二人で共有しておく必要もないのでバレる心配がない


注1:公開鍵暗号のためには以下の二つの条件が必要です。

  • $f(m,k_1)$ と $k_1$ から $m$ は復元できない(防御のため)
  • $f(m,k_1)$ と $k_2$ から $m$ が復元できる(復号のため)

実際にこのような状況を作るのはそんなに簡単ではありません。ここで数学が必要になります。例えば→RSA暗号の仕組みと安全性

注2:送信者と受信者を固定して考えましたが,双方向にやりとりをしたいときは,二人が別々に公開鍵,秘密鍵を作ればOKです。

暗号理論の深い部分も面白そうだなあと感じています。よい本があればご一報下さい。