ブロック暗号とは
ブロック暗号の概要を見ていきましょう。
特定のビット数を一度に暗号化する方法
ブロック暗号とは、平文のデータを特定の長さに区切り、その区切った単位で暗号化するアルゴリズムです。たとえば、代表的なブロック暗号であるAESでは128・192・256bitのデータをまとめて暗号化します。
ブロック暗号により生成された暗号文は平文と同じ長さになります。
ストリーム暗号との違い:暗号化を行う単位
ブロック暗号とは対照的に、データを1bitや1byteなど細かい単位で暗号化するアルゴリズムをストリーム暗号といいます。乱数を発生させて、その乱数を元にデータを端から暗号化していきます。
ストリーム暗号はブロック暗号と比較し、リアルタイム性が求められる通信に適しているのが特徴です。ブロック暗号は一定量のデータが溜まらなければ処理できませんが、ストリーム暗号なら逐次処理できるためです。ただし、安全性の検証はブロック暗号のほうが進んでいます。
ブロック暗号の仕組み
以下の文字列(平文)を例に、ブロック暗号の仕組みを見ていきましょう。
- ■「ありがとうございます」
ブロック暗号では平文を一定の長さに分割して暗号化します。たとえば、上記の平文を5文字ずつに区切ってみましょう。
- ■ブロック1「ありがとう」
- ■ブロック2「ございます」
ブロック1から順に暗号化します。ここではよく利用される「転字」という方法を例に紹介します。これは文字を入れ替えることで文意が分からないようにする操作です。
- ■ありがとう ⇒ があうとり
同様にブロック2も転字操作を行い「まざすごい」になったとしましょう。その結果、できあがる暗号文は「があうとりまざすごい」となります。
基本的には上記のような操作を繰り返して平文全体を暗号化します。実際には「転字」のほかにも、文字を置き換える「換字」などの操作を行い、より複雑な暗号文を作ります。
代表的なブロック暗号のモード
ブロック暗号はブロックごとの暗号化を繰り返すことで平文全体を暗号化します。その繰り返し方法のことをモードといい、利用モードによって暗号化の結果は変わります。ここでは代表的なモードを2つ見ていきましょう。
どのブロックにも同じ暗号処理を行う「ECBモード」
ECBモードで暗号化した場合、同じ平文からは常に同じ結果が得られます。各ブロックの前後関係にかかわらず、すべてのブロックに同じ暗号化を適用するためです。特別なルールがない繰り返し方法といえるでしょう。
もっともシンプルで分かりやすく、実装が簡単なうえ処理が高速なのが長所です。しかし、第三者からパターンを解析され、暗号文を不正に復号されやすいため、安全性の観点からは推奨されません。
また、ECBモードは暗号化結果が常に同じであることから、反射攻撃にも悪用されます。反射攻撃とは、認証データを通信途中で不正に取得し他者になりすます行為です。
たとえば、ログイン画面でユーザーが入力したパスワードの暗号文を取得し、それを使って不正ログインする行為が該当します。常にパスワードの暗号化結果が同じであれば、第三者は元のパスワードが分からなくても、暗号文でログインできてしまうのです。
直前のブロックをもとに暗号化する「CBCモード」
CBCモードは、平文を直前の暗号文ブロックの情報を元に暗号化するモードです。つまり、同じ平文でも直前の暗号文によって暗号化結果が異なるということです。
具体的には、平文と直前の暗号文の各bitをXOR演算した結果に対して暗号化処理を行います。XOR演算とは論理演算の1種で、1あるいは0を出力します。
この処理により平文は元の文章から変化し、その上から暗号化を施されるため、仮に他のブロックと同じ文面があっても異なる暗号文になります。CBCモードは暗号文のパターンを解析されづらいことから、安全性の高いモードとして広く使われています。
ちなみに、一番初めのブロックには参照すべき直前の暗号化ブロックが存在しません。そのため、その代理となるランダムな文字列を参照します。その文字列を初期化ベクトルと呼び、これを毎回変化させることで、第三者による解析をより困難なものにできます。
最適なブロック暗号のモードを使って秘匿性を高めよう!
ブロック暗号とは、データを特定の長さに区切ってブロック分けし、ブロックごとに暗号化処理を施すアルゴリズムです。各ブロックへの暗号化処理の繰り返し方法をモードと呼び、これによって暗号化結果は変化します。代表的なモードは以下の2つです。
- ECBモード
- 同じ処理を繰り返す
- CBCモード
- 直前のブロックの暗号文を参照する
以上を参考にして適切な暗号化を行い、自社の情報を守りましょう。