暗号技術 ~対称暗号方式の仕組み~ (2週目) 暗号技術 ~対称暗号方式の仕組み~ (2週目) 情報工学科 04A1004 石川 真悟
対称暗号(共通鍵暗号) ストリーム暗号 ブロック暗号 DES(米国標準の暗号技術) トリプルDES(DESを強化したもの) AES/Rijndael(DESに代わる新しい米国標準暗号技術)
ストリーム暗号(逐次暗号) 同じ鍵を使って平文を1ビット、または8ビット(1バイト)単位で逐次的に暗号化。 例えば、鍵の長さが32ビットあっても、暗号化処理の単位は1ビットまたは8ビット(1バイト)単位になる。 平文のデータがなくなるまで、8ビット単位で繰り返し処理が行われる。
ストリーム暗号の処理例(32ビット) 10101010 10101010 10101010 10101010 + + + + 8ビット 8ビット 8ビット 8ビット 平文 10101010 10101010 10101010 10101010 + + + + 鍵 11111111 11111111 11111111 11111111 処理1 処理1 処理2 処理3 処理4 01010101 01010101 01010101 01010101 暗号文
ストリーム暗号の特徴 同じ処理を繰り返すだけなので、平文と暗号文の対応関係から鍵の情報を解読することが、比較的容易にできる。⇒できるだけ頻繁に鍵を変える必要がある。 鍵を生成する際には、できるだけ複雑な乱数を生成する必要がある。 ストリーム暗号は乱数を使った鍵の生成が、とても高速に処理できる。⇒音声通話、データ通信の暗号化方式として多く用いられる。 ストリーム暗号の1つに、バーナム暗号がある。 バーナム暗号は、乱数を使って平文と同じ長さの鍵を生成し、この鍵は1回利用する毎に完全に使い捨てる。このため、バーナム暗号は理論的には解読不可能とされている。ただし、鍵の生成処理や鍵の受け渡し、鍵の保管など解決されていない多くの課題があるために実用化されていない。 近年のストリーム暗号は、特定の長さで鍵を生成するため、バーナム暗号に比べて暗号強度が低いものの、実用的な暗号化方式として一般に利用されている。
ブロック暗号 同じ鍵を使って平文を一定のビットのまとまりごとに暗号化する。この一定のビットのまとまりをブロックと呼び、1つのブロックの長さをブロック長と呼ぶ。 ストリーム暗号との違い⇒ストリーム暗号は同じ暗号化処理を行なうのに対しブロック暗号は、換字暗号や転置暗号と呼ばれる暗号化処理をブロック毎に複雑に組み合わせて暗号化処理を行なう。
ブロック暗号の処理例(64ビット) 101010・・・10 101010・・・10 101010・・・10 + + + 64ビット 64ビット 64ビット 平文 101010・・・10 101010・・・10 101010・・・10 + + + 鍵 111111・・・11 111111・・・11 11111・・・111 処理1(換字暗号) 処理2(転置暗号) 処理3(換字暗号) 010101・・・01 010101・・・01 010101・・・01 暗号文
ブロック暗号の特徴 ブロック毎に換字暗号や転置暗号といった異なった暗号化を複雑に組み合わせて処理を行なうため、一部のブロックの平文と暗号文の対応関係がわかったとしても、鍵の情報を簡単に解読できない。 最も暗号強度が高いブロック暗号は、平文の途中1ビットが正しく変換されなかった場合、このビット以降の暗号文全体に影響して、平文と暗号文の関係を見つけられなくする。 近年のブロック暗号は、これに近い暗号強度を持っているため、暗号解読は、現実的な時間内では困難。 しかし、近年のコンピュータの性能が飛躍的に向上しているので、解読処理にかかる時間が短縮されつつある。よって、コンピュータの性能が向上するにつれて、鍵の長さをさらに長くしたり、暗号化の組み合わせをさらに複雑にするといった対処が必要。
ブロック暗号はブロックごとに暗号化処理を行なうが、処理の順番や方法がいくつかある。この処理の方法をモードと呼ぶ。 ブロック暗号のモード ブロック暗号はブロックごとに暗号化処理を行なうが、処理の順番や方法がいくつかある。この処理の方法をモードと呼ぶ。 モード 名称 説明 ECBモード 電子符号表モード 平文ブロックを最初から順番にそのまま暗号化する。シンプルだが、弱点があるため、あまり使われていない。 CBCモード 暗号ブロック連鎖モード 1つ前の暗号文ブロックと平文ブロックの内容を混ぜ合わせてから暗号化を行なう。 CFBモード 暗号フィードバックモード 1つ前の暗号化ブロックを暗号アルゴリズムの入力に戻して暗号化し、平文ブロックの内容と混ぜ合わせる。 OFBモード 出力フィードバックモード 1つ前の暗号化の出力を暗号アルゴリズムの入力に戻して暗号化し、平文ブロックの内容と混ぜ合わせる。 CTRモード カウンタモード 1ずつ増加していくカウンタを暗号化して、鍵ストリームを作り出し、平文ブロックの内容と混ぜ合わせる。
ECBモード ECBモードの暗号化 ECBモードの復号化 平文 暗号文 平文 ブロック1 平文 ブロック2 平文 ブロック3 暗号文 ECBモードで暗号化すると平文ブロックと暗号文ブロックは一対一の関係の対応表ができる。このことから、ECBモードは電子符号表モードと呼ばれる。 平文ブロックを最初から順番に暗号化し最後の平文ブロックがブロック長に満たない場合、パディングと呼ばれるダミーのデータを埋め込み、暗号化処理が行なわれる。 ECBモードの暗号化 ECBモードの復号化 平文 暗号文 平文 ブロック1 平文 ブロック2 平文 ブロック3 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 ・・・ ・・・ 暗号化 暗号化 暗号化 ・・・ 復号化 復号化 復号化 ・・・ 暗号文 平文 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 平文 ブロック1 平文 ブロック2 平文 ブロック3 ・・・ ・・・ 弱点・・・どれか1つの平文ブロックと暗号文ブロックの関係を解析できてしまうと、ここから鍵の情報がわかってしまい、他のブロックも解読される。また、ブロックの長さがわかってしまうと、暗号文ブロックを入れ替えるだけで、巧妙に情報を改竄できる。暗号文ブロックを入れ替えると、復号化では正常に処理ができる。
CBCモード 1つ前の暗号文ブロックと平文ブロックの内容を混ぜ合わせてから、さらに暗号化を行なう。ブロックがチェーンのように連携していくため、暗号ブロック連鎖モードと呼ばれる。 最初の平文ブロックを暗号化するときには、1つ前の暗号化ブロックがないため、この暗号ブロックの代わりに、初期化ベクトルと呼ばれる特別なビット列のブロックを用意する必要がある。初期化ベクトルは、暗号化のたびに変化させることで暗号強度を高くすることができる。 CBCモードは、必ず1つ前の暗号文ブロックと平文ブロックの内容を混ぜ合わせてから、さらに暗号化するため、平文ブロック1と平文ブロック2の値が等しくても、暗号化ブロック1と暗号化ブロック2の値が等しくなるとは限らない。 また、途中のブロックだけ抜き出しても解読することはできない。例えば、暗号ブロック3を解読したい場合には、初期化ベクトルと解読を終えた平文ブロック1と平文ブロック2が必要になる。このため、CBCモードは解読が難しいのが特徴。
CBCモードの暗号化・復号化 CBCモードの暗号化 CBCモードの復号化 平文 暗号文 平文 ブロック1 平文 ブロック2 平文 ブロック3 ・・ ・・ 初期化 ベクトル XOR 処理 XOR 処理 XOR 処理 復号化 復号化 復号化 ・・ ・・・ XOR 処理 XOR 処理 XOR 処理 暗号化 暗号化 暗号化 ・・・ ・・ 暗号文 平文 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 平文 ブロック1 平文 ブロック2 平文 ブロック3 ・・ ・・ 初期化 ベクトル
CFBモード 1つ前の暗号文ブロックを暗号アルゴリズムの入力に戻し、再度暗号化を行なった後、平文ブロックの内容と混ぜ合わせを行なう。 暗号ブロックを暗号アルゴリズムの入力に戻すため、暗号フィードバックモードと呼ばれる。 最初の平文を暗号化するときには、1つ前の暗号文ブロックがないため、この暗号文ブロックの代わりに、初期化ベクトルのブロックを用意する必要がある。 暗号アルゴリズムが生成するビット列を鍵ストリームという。 CFBモードでは、復号化を行なう時にも暗号化を行なう。 初期化ベクトルは、暗号化のたびに変化させることで暗号強度を高くすることができる。
CFBモードの暗号化・復号化 CFBモードの暗号化 CFBモードの復号化 平文 暗号文 平文 ブロック1 平文 ブロック2 平文 ブロック3 ・・ ・・ 初期化 ベクトル 暗号化 暗号化 暗号化 ・・ 暗号化 暗号化 暗号化 ・・・ XOR 処理 XOR 処理 XOR 処理 XOR 処理 XOR 処理 XOR 処理 ・・・ ・・ 暗号文 平文 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 平文 ブロック1 平文 ブロック2 平文 ブロック3 ・・ ・・ 初期化 ベクトル
OFBモード 1つ前の暗号化の出力を暗号アルゴリズムの入力に戻し、再度暗号化を行なった後、平文ブロックの内容と混ぜ合わせる。暗号化の出力を暗号アルゴリズムの入力に戻すため、出力フィードバックモードと呼ばれる。 最初の平文を暗号化するときには、1つ前の暗号文ブロックがないため、この暗号文ブロックの代わりに、初期化ベクトルのブロックを用意する必要がある。 暗号アルゴリズムが生成するビット列を鍵ストリームという。 OFBモードでは、復号化を行なう時にも暗号化を行なう。 初期化ベクトルは、暗号化のたびに変化させることで暗号強度を高くすることができる。 この暗号アルゴリズムでの鍵の生成は、平文ブロックの処理とは無関係に処理できるため、事前に鍵を生成しておけば実際の平文の処理を高速に行なえる。
OFBモードの暗号化・復号化 OFBモードの暗号化 OFBモードの復号化 暗号化 暗号化 暗号化 ・・・ 暗号化 暗号化 暗号化 ・・・ 平文 暗号文 平文 ブロック1 平文 ブロック2 平文 ブロック3 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 ・・ ・・ XOR 処理 XOR 処理 XOR 処理 XOR 処理 XOR 処理 XOR 処理 ・・ ・・ 初期化 ベクトル 初期化 ベクトル 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 平文 ブロック1 平文 ブロック2 平文 ブロック3 平文 ・・ ・・ 暗号文
CTRモード 1つずつ増加していくカウンタを暗号化して、鍵ストリーム(暗号アルゴリズムが生成するビット列)を作りだし、平文ブロックの内容と混ぜ合わせる。 カウンタから鍵ストリームを生成するため、CTRモードはカウンタモードと呼ばれる。 CTRモードは、復号化を行なう時にも暗号化を行なう。 この暗号アルゴリズムでの鍵の生成は、平文ブロックの処理とは無関係に処理できるため、事前に鍵を生成しておけば実際の平文の処理を高速に行なえる。 カウンタの初期値は、ノンスと呼ばれる暗号化のたびに異なる値とカウントアップする値を組み合わせて生成する。 (例)カウンタの長さが128ビットの時、前半64ビットをノンス、後半64ビットをカウントアップ値として使用する。 CTRモードでは、このカウンタの値をさらに暗号化しているため、暗号強度はより高くなる。 11 22 33 44 55 66 77 88 00 00 00 00 00 00 00 01 ノンス カウントアップ値
CTRモードの暗号化・復号化 CTRモードの暗号化 CTRモードの復号化 カウンタ カウンタ+1 カウンタ+2 ・ カウンタ カウンタ+1 ・・・ 暗号化 暗号化 暗号化 ・・・ 暗号化 暗号化 暗号化 ・・・ 暗号文 平文 平文 ブロック1 平文 ブロック2 平文 ブロック3 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 ・・ ・・ XOR 処理 XOR 処理 XOR 処理 XOR 処理 XOR 処理 XOR 処理 ・・ ・・ 暗号文 暗号文 ブロック1 暗号文 ブロック2 暗号文 ブロック3 平文 ブロック1 平文 ブロック2 平文 ブロック3 平文 ・・ ・・
使い捨てパット(バーナム暗号) 代表的なストリーム暗号方式。 平文とランダムなビット列で生成した鍵でXOR(排他的論理和)の計算を行なう。シンプルな暗号方式だが、鍵の情報が外部に漏れない限り、解読することはできない。
使い捨てパットの特徴 解読することが不可能な暗号方式(あくまで、鍵の情報が外部に漏れないことが前提) 鍵の情報は、ランダムなビット列なため、あらゆるパターンが考えられる。解読する際、このすべてのパターンのビット列の鍵の中から本当の鍵を見つけなければならない。しかし、盗聴者は鍵の情報も平文の情報も知らないため、復号化した平文から本当の鍵を見つけることができない。 また、使い捨てパットは、平文と同じ長さのビット列の鍵を使って暗号化するという特徴がある。これが、さらに解読を難しくしている。
使い捨てパットの欠点 鍵の生成の問題 鍵の受け渡しの問題 鍵の保管の問題
鍵の生成の問題 使い捨てパットは、平文と同じ長さのビット列の鍵を、平文ごとに生成する必要がある。平文がまれに同じ長さであっても、鍵は作り替える必要がある。これは、同じ鍵を使って情報交換を続けることは、盗聴者に対して読解のパターンと機会を多く与えてしまうことになるから。このため、一度使った鍵は捨てる必要がある。 また、簡単に解読されないようにするため、コンピュータを使って生成した擬似的な乱数でなく、再現性のない真の乱数を使って鍵を生成する必要がある。この鍵の生成が手間のかかる作業になる。 ※擬似乱数とは、乱数列(乱数)のように見えるが、実際には確定的な計算によって求めている数列に含まれる数を指す。擬似乱数を生成する機器(やアルゴリズム)を擬似乱数生成器(や擬似乱数生成法)と呼ぶ。乱数は本来規則性も再現性も無いために予測は不可能だが、擬似乱数は計算によって作るので、作り方が分かれば理論的には予測可能であり、また内部の初期値(シード)が分かれば、先に計算しておくこともできる。 弱い擬似乱数・・・ 無作為性しか持たない 強い擬似乱数・・・ 無作為性、予測不可能性を持つ 真の乱数・・・ 3つすべての性質を持つ 無作為性・・・ 統計的な偏りがなく、でたらめな数列になっているという性質。 予測不可能性・・・ 過去の数列から次の数を予測できないという性質。 再現不可能性・・・ 同じ数列を再現できないという性質。再現するためには、数列そのものを保存しておくしかない。
鍵の受け渡しの問題 使い捨てパットは、平文と同じ長さのビット列の鍵を使って暗号化するため、復号化する際には、この同じ鍵を使う必要がある。 暗号文をネットワークを介して相手に送る際、鍵は別ルートで安全に受け渡す必要がある。 また、鍵は平文ごとに作り直す必要があるため、平文を送るたびに鍵も受け渡す必要がある。
鍵の保管の問題 情報を暗号化して保管する場合には、鍵も保管する必要がある。鍵を紛失すると暗号文を復号化できなくなる。 情報が100Mバイトのサイズがあると鍵の長さも100Mバイトになり、保管しなければならない情報のサイズが2倍になってしまう。また、同じ場所に保管していても意味がないため、保管場所を考慮する必要がある。