当サイトにおける暗号に関するページでは、説明が足りなかったり、誤った記述をしていたりするところがあります。今後、少しずつ修正する予定です。
暗号理論の『暗号技術のすべて』が発売されています。初心者向けの暗号本です。これまで暗号本に何度か挑戦しつつも挫折してしまった方、学校の課題で悩んでいる方、資格試験にて暗号の問題が苦手な方などにお勧めです。
興味がある方は宣伝サイトを参照してください。Amazonでも発売中です。
共通鍵暗号系とは、送信者が平文Mと鍵Kを入力として暗号化アルゴリズムによ り暗号文Cを出力する。その暗号文Cを通信路に通じて受信者の復号アルゴリズ ムに入力する。その際、鍵Kを用いる。その結果、平文Mを出力する。
共通 鍵暗号系という名前からわかると思うが、暗号化アルゴリズムと復号アルゴ リズムで使われている鍵は両方とも共通するものである。あくまで暗号化アルゴリズムと復号アルゴリズムは一般公開されているものなので、アタッカーももちろん知っている。ということは、鍵Kがこの送信者と受信者の二人だけで秘密にしておかなければならないのである。もし、アタッカーの手に鍵Kが渡ってしまった場合、盗聴した暗号文Cから簡単に平文Mを得てしまうことができてしまうわけだ。
ここで重要なのは、暗号化によって盗聴を防ぐわけではない。盗聴され ても内容がわからないようにするわけである。
動作の基本概念は、平文と暗号文の関係を「第三者には未知の一対一写像の乱数表で関連付ける」ことである。この乱数表は秘密鍵によって異なる。
理論上、無尽蔵なメモリ空間があれば、あらかじめ安全な乱数表を作ることで安全な共通鍵暗号を実現できる。例えば、鍵長128ビットの128ビットブロック暗号(鍵長128ビットかつブロック長128ビット)ならば、ひとつの乱数表が2133バイトで構成され、それが2SUP{128}個必要なので、メモリ空間が約2220Tバイトあれば、安全である。
しかしこれほど大きなメモリ空間を用意するのは不可能である。そこで、「換字」(文字を別の文字に変換する)と「転置」(2つの文字の場所を入れ換える)の2つを組み合わせることで、乱数表を擬似的に実現する方法がとられる。
よって安全な共通鍵暗号というのは、秘密鍵を知らなければ、擬似的に作られる乱数表を部分的にも作れないことを意味する。
例1:Camelliaの場合、Feistal構造の中の関数内で換字と転置を行っている。
例2:AESの場合、ByteSub()操作が換字、ShiftRows()操作とMixColumn()操作が転置を行う。
そして優れた共通鍵暗号は、安全な乱数表をより少ない計算能力でより高速に作り出せるということになる。
共通鍵暗号系は、ストリーム暗号とブロック暗号に大別される。ストリーム 暗号とはその名の通りビットごとに処理し、ブロック暗号はビット列というブロ ック単位で処理する。
ブロック暗号はブロック長によって次のように分類される。
ここでいうビット数は鍵長のことではなく、あくまでブロック長のことである。
[注意]○ビットブロック暗号といったときは、「鍵長が○ビット」というわけではなく、「ブロック長が○ビット」のことを指す。
ブロック暗号は暗号構造によって次のように分類される。
集合{0,1}上に、演算を次のように定義します。
00=0
0
1=1
1
0=1
1
1=0
これは、mod 2の世界の足し算と思えばよいでしょう。
0+0≡0 (mod 2) 0+1≡1 (mod 2) 1+0≡1 (mod 2) 1+1≡0 (mod 2)
デジタル回路の世界では排他的論理和(XOR演算)として登場します。この講座 では今後XOR演算と呼ぶことにします。
なぜこのような演算を定義したのかというと、共通鍵暗号系の仕組みのおいて XOR演算が利用されているからです。
2つのnビット列(a1,…,an)、(b1,…,bn)(∈{0,1}n)があったとします。この 2つのビット列に対して、XOR演算をすることを次のように定義します。
(a1,…,an)(b1,…,bn)=(a1
b1,…,an
bn)