読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

ブロック暗号化モード

ぼくの中で、暗号化、復号化がわりとホットな話題になってきたのですが、DES や DESede、AES とかの文脈で出てくる ECB だの CBC だのというブロック暗号化モードなるものが理解できなかったので勉強してみた。学び大事。

ブロック暗号化モードとは

そもそも暗号には、ストリーム暗号だとかブロック暗号だとかいうカテゴリ分けがあります。ストリーム暗号っていうのが、平文をビットとかバイト単位で暗号化していく方法で、WEP とか、WPA とかがこのカテゴリに属してます。
一方で、ブロック暗号は、固定長のデータをブロックと呼んでいて、このブロックを対象にして暗号化する方法を指します。DES とか AES とかはこちらですね。

ブロック暗号におけるブロックは、その定義から固定長なわけですが、暗号化対象のデータっていうのはそのブロック長よりも長いケースが出てきます。このような場合に、対象データをどうやって暗号化していくのかを定めるモードがブロック暗号化モード (wikipedia:暗号利用モード)です。

暗号利用モード

ぼくが興味があったのは ECB と CBC です。

ECB というのは Electronic CodeBook の略で、データをブロックに分割した後、それらブロックを独立して暗号化するという非常にシンプルな暗号化モードです。シンプルであるが故に、セキュリティ的には脆弱です。

脆弱なのは、「同じブロックに対して、同じ出力がなされる」という点。あるブロックに対する暗号が解読されると、同一のデータを持っているブロックは全て解読されたのと同じです。なので基本的に、ECB は用いられません。

これに対する CBC は、Cipher Block Chaining の略になっていて、その名前の通り、ブロックの暗号化を連鎖させます。

具体的には、ブロックの暗号化を行う際に、「前のブロックの暗号化結果」と「今回のブロックのデータ」の XOR を取り、その結果を暗号化させるという方法を取ります。この結果として、今回ブロックの暗号化は前段ブロックの暗号化結果に依存することになり、同じデータを持つブロックに対しても異なる暗号化結果が生成されることになります。
なお、「前のブロック」が存在しない「最初のブロック」を暗号化するために、初期化ベクタ (IV) を入力パラメータとして取ることになります。
また、手法上、ブロック毎に同時並行しての暗号化はできないため、ECB に対してパフォーマンスは下がります。