ブロック暗号の暗号利用モード

皆さん、こんにちは。技術開発グループのn-ozawanです。
米国眼科学会議が推奨している20-20-20ルールとは、20分間ディスプレイで作業したら、20秒間だけ、20フィート(約6m)離れたところを見続けることで、眼精疲労を軽減しましょうというものです。私たちITエンジニアはコンピュータビジョン症候群が職業病なところがありますので、目を大事にしたいですね。

本題です。
前回、共通鍵暗号方式についてお話ししました。共通鍵暗号方式にはブロック暗号とストリーム暗号があり、このブロック暗号は決められたbit数(AESでは128bit)までしか暗号化してくれません。なので、大きなデータを暗号化するときは、ブロック暗号を繰り返す必要があります。この繰り返す方法を「暗号利用モード」と呼んでおり、今回は暗号利用モードをいくつか紹介したいと思います。

暗号利用モード

ECBモード

ECBモードは、一番シンプルなモードで、平文をブロックごとに暗号化していくやり方です。暗号化および復号化で並列処理が可能なため、処理速度も期待できます。しかし、同じ平文ブロックを暗号化すると、同じ暗号ブロックが出力されてしまうため、攻撃者に内容を推測される危険があります。これに関しては、wikipedia (2023-08-23現在)に分かりやすい画像がありますので、イマイチ分からない方は見てみてください。推測される危険以外にも、暗号文ブロックを任意に入れ替えることにより、データを改ざんすることも可能です。このようにECBモードは脆弱性が多くあり、使用は推奨されていません。

CBCモード

CBCモードは、ECBモードの欠点を補ったやり方です。暗号化する際、IV(Initialization Vector)と平文をXORして、その結果を暗号化します。その次のブロックでは、前の暗号文ブロックと平文ブロックをXORして、その結果を暗号化します。これにより、仮に同じ平文ブロックでも異なる暗号文ブロックが生成されます。

復号化する際は、暗号化とは逆の手順となります。暗号文ブロックを復号化し、その結果と前の暗号文ブロックをXORして平文を求めます。もし暗号文ブロックを任意に入れ替えたとしても、復号化後のXORにより正しい平文ブロックは得られず、攻撃者による改ざんは成立しません。

CBCモードの欠点は暗号化の並列化が出来ないことです。ただし、復号化は並列化が可能です。CBCモードはTLS1.2までは広く利用されていましたが、いくつかの脆弱性が発見され、TLS1.3からは廃止となりました。

CTRモード

CTRモードは、カウンタ値を暗号化して、その結果と平文をXORするやり方です。カウンタはブロックごとにインクリメントして暗号化します。

先ほどのCBCモードでは平文を暗号化していました。もし平文がブロック長に達していない場合、平文がブロック長と同じになるようにデータをパティングする必要があります(例:32bitの平文をAESで暗号化する場合、96bit分をパティングして、128bitにしてから暗号化する)。しかし、このパディングにより、共通鍵無しでも暗号文を復号化出来る「パディングオラクル攻撃」という脆弱性が発見されています。

CTRモードではカウンタを暗号化するため、平文をパディングする必要がなく、パディングオラクル攻撃の心配はありません。また、CTRモードの利点としては、暗号化/復号化ともに並列処理が可能であることと、暗号化と復号化が同じロジックで行えることにあります。

GCMモード

GCMモードは、CTRモードにガロア認証を行うことにより、データ改ざんを検知するやり方です。暗号化/復号化ともにCTRモードと同じやり方です。カウンタ値や暗号文ブロックなどからハッシュ値(GHASH)を求めていき、最後にTAGを生成します。復号化の際には、このTAGで暗号文が改ざんされていないかを検証します。

現在、ブロック化暗号においてはGCMモードがデファクトスタンダードになっているようで、TLS1.3でもAES+GCMモードが採用されています。

おわりに

今回は暗号利用モードを紹介しました。ブロック暗号を繰り返し行うにしても、色々と工夫しないと脆弱性につながるんですね。今はAES+GCMが主流ですが、数年後には新たな脆弱性が見つかって、他の手法になっているかもしれませんね。

ではまた。

Recommendおすすめブログ