「ECBモード」、「CBCモード」、「OFBモード」の違いとメリデメをまとめてみた(サンプルコードあり)
暗号化の利用モードは、ブロック暗号をどのように適用するかを決定する方式です。これらのモードはデータの安全性に直接影響を与え、使用目的に応じて選択されます。代表的なモードには「ECBモード」、「CBCモード」、「OFBモード」等があります。それぞれの概要と、セキュリティおよび運用上のメリットとデメリットを説明します。
※CFBモードと、CTRモードも追加予定です。
1. ECBモード (Electronic Codebook Mode)
概要
ECBモードは最も単純な暗号利用モードで、各ブロックを独立して暗号化します。ブロックごとに同じ鍵を使って暗号化を行うため、同じ平文ブロックは常に同じ暗号文ブロックに変換されます。
メリット
高速かつシンプル: 各ブロックが独立して暗号化されるため、並列処理が可能であり、高速です。
エラー伝播なし: 一つのブロックが誤っても、他のブロックには影響を与えません。
デメリット
セキュリティの脆弱性: 同じ平文ブロックが同じ暗号文ブロックに暗号化されるため、パターンが明らかになります。例えば、画像のようなデータでは、暗号化後も元の構造が残るため、攻撃者が平文のパターンを推測しやすくなります。
耐攻撃性が低い: 選択平文攻撃に対して脆弱です。
と、このように、脆弱性があるため基本的には使用は推奨されていません。
サンプルコード(C言語)
Key1[0] = Key1 // 初期鍵 (64 ビット)
Key2[0] = Key2 // 初期鍵 (64 ビット)
Key3[0] = Key3 // 初期鍵 (64 ビット)
PT = PT_0 // 初期平文
for (i=0; i<outerloop; i++)
{
for (j=0; j<innerloop; j++)
{
CT[j] = Encryption(Key1[i], Key2[i], Key3[i], PT) // ECB モード暗号化
PT = CT[j]
}
Output CT[innerloop-1] // 内側ループ内で計算された最後の暗号文
Key1[i+1] = Key1[i] xor CT[innerloop-1]
Key2[i+1] = Key2[i] xor CT[innerloop-2]
Key3[i+1] = Key3[i] xor CT[innerloop-3]
}
2. CBCモード (Cipher Block Chaining Mode)
概要
CBCモードは、ECBの欠点を補った方法といえます。各ブロックの暗号化に前のブロックの暗号文を使用します。最初のブロックには初期化ベクトル(IV)が使用され、その後の各ブロックは、前の暗号文ブロックと平文ブロックをXOR演算した結果を暗号化します。これにより、同じ平文ブロックでも異なる暗号文ブロックが生成されることになります。
メリット
高度なセキュリティ: 同じ平文でも異なる暗号文になるため、パターンが見えにくくなります。
誤り検出が可能: 誤ったブロックが含まれている場合、その後のブロックにも影響が出るため、エラー検出がしやすくなります。
デメリット
シリアル処理が必要: 各ブロックの暗号化に前のブロックの結果が必要なため、並列処理ができず、速度が制限されます。
エラー伝播: 1つのビットのエラーが次のブロックにも伝播し、誤りが拡大する可能性があります。
この方法も、いくつかの脆弱性( BEAST攻撃 (Browser Exploit Against SSL/TLS)や、POODLE攻撃 (Padding Oracle On Downgraded Legacy Encryption)など)が発見され、TLS1.3からは廃止されています。
サンプルコード(C言語)
Key1[0] = Key1 // 初期鍵 (64 ビット)
Key2[0] = Key2 // 初期鍵 (64 ビット)
Key3[0] = Key3 // 初期鍵 (64 ビット)
IV = IV_0 // 初期 IV
PT = PT_0 // 初期平文
for (i=0; i<outerloop; i++)
{
for (j=0; j<innerloop; j++)
{
CT[j] = Encryption(Key1[i], Key2[i], Key3[i], IV, PT) // CBC モード暗号化
If( i==0 )
{
PT = IV
}
else
{
PT = CT[j-1]
}
IV = CT[j]
}
Output CT[innerloop-1] // 内側ループ内で計算された最後の暗号文
Key1[i+1] = Key1[i] xor CT[innerloop-1]
Key2[i+1] = Key2[i] xor CT[innerloop-2]
Key3[i+1] = Key3[i] xor CT[innerloop-3]
}
3. OFBモード (Output Feedback Mode)
概要
OFBモードは、IV(初期化ベクトル)を暗号化し、その出力を次の暗号化の入力として使用します。この出力と平文をXOR演算して暗号文を生成します。
メリット
エラー伝播なし: 1ビットの誤りが発生しても、それが次のブロックに伝播しません。
リアルタイム通信に適合: ブロック暗号をストリーム暗号のように扱うため、リアルタイムデータの暗号化に適しています。
デメリット
IVの重要性: IVが予測可能または再利用されると、セキュリティが損なわれます。
耐攻撃性の脆弱性: CBCよりも選択平文攻撃に対する耐性が低くなります。
サンプルコード(C言語)
Key1[0] = Key1 // 初期鍵 (64 ビット)
Key2[0] = Key2 // 初期鍵 (64 ビット)
Key3[0] = Key3 // 初期鍵 (64 ビット)
IV = IV_0 // 初期 IV
PT = PT_0 // 初期平文
for (i=0; i<outerloop; i++)
{
INIT_PT = PT
for (j=0; j<innerloop; j++)
{
CT[j] = Encryption(Key1[i], Key2[i], Key3[i], IV, PT) // OFB モード暗号化
PT = IV
IV = O[j] // O[j]=Encryption() 内で平文を xor する直前の値
}
Output CT[innerloop-1] // 内側ループ内で計算された最後の暗号文
Key1[i+1] = Key1[i] xor CT[innerloop-1]
Key2[i+1] = Key2[i] xor CT[innerloop-2]
Key3[i+1] = Key3[i] xor CT[innerloop-3]
PT = PT xor INIT_PT
}
まとめ
ECBモードは単純で高速ですが、セキュリティが弱く、特定の用途(例えば、データベースのレコードの暗号化)に適していますが、一般的には避けるべきです。
CBCモードはセキュリティが高く、多くの用途で使われますが、並列処理が難しく、エラー伝播のリスクがあります。
OFBモードはリアルタイム通信に適しており、エラー伝播の問題を解決していますが、IVの管理が重要で、特定の攻撃に対して脆弱です。
これらのモードは、それぞれの特徴に応じて適切な場面で使用されるべきです。セキュリティと運用のバランスを考慮し、適切なモードを選択することが重要です。
参考文献
[IPA 暗号アルゴリズム実装試験仕様書 -共通鍵-]
免責事項
免責事項
情報の正確性について
当ブログでは、IT技術に関する情報や知識を提供していますが、その内容の正確性や信頼性については十分に注意を払っております。しかし、掲載されている情報が最新であるか、正確であるかについて保証するものではありません。また、予告なく内容を変更、修正、削除する場合があります。ブログの情報を利用する際は、必ずご自身の責任で行ってください。
法律的助言について
当ブログで提供している情報は、一般的な情報提供を目的としており、法律的な助言を提供するものではありません。具体的な法律問題や個別の案件については、弁護士などの専門家に相談されることをお勧めします。
外部リンクについて
当ブログでは、参考資料や関連情報として外部のウェブサイトへのリンクを提供することがありますが、これらのリンク先サイトの内容や安全性については責任を負いかねます。リンク先サイトの利用に関するトラブルや損害については、リンク先の運営者の責任となりますので、ご了承ください。
免責事項の変更について
当ブログは、予告なく本免責事項の内容を変更することがあります。変更後の免責事項は、当ブログに掲載された時点で効力を生じるものとします。最新の内容をご確認いただくことをお勧めします。
Discussion