CBCモードの基礎

CBCモード(とついでにECBモード)について『暗号技術入門 第3版』で勉強したときのメモを投稿。

フローチャートの凡例

ブロック暗号の「モード」とは

プロック暗号(DES, AESなど)は、1ブロック分の平文を暗号化する。
1ブロックより長い平文を暗号化するには、ブロック暗号を繰り返す必要がある。
この繰り返す方法を モード(mode) という。

  • 用語の定義
    • 平文ブロック: ブロック暗号で暗号化する対象となる平文
    • 暗号文ブロック: ブロック暗号で平文ブロックを暗号化した暗号文

どちらも長さは1ブロック。

ECBモード

ECBモード(Electronic CodeBook mode: 電子符号表モード) では、平文ブロックを普通に暗号化する。

単純に暗号化するだけのため、簡単だが「同じ値の平文ブロックは同じ暗号文ブロック」になってしまう。
普通は使わない。

graph TD  
planBlock[/平文ブロック/] --> 暗号化 --> outEncBlock[/暗号文ブロック/]  

CBCモード

CBCモード(Cipher Block Chaining: 暗号ブロック連鎖モード) では、
1つ前の暗号文ブロックと平文ブロックの XOR を取ってから暗号化を行う。

graph TD  

inEncBlock[/1つ前の暗号文ブロック/] --> XOR  
planBlock[/平文ブロック/] --> XOR  
--> 暗号化 --> outEncBlock[/暗号文ブロック/]  

復号時には、
暗号文ブロックを復号してから、その結果と1つ前の暗号文ブロックとの XOR を取る。

graph TD  

preEncBlock[/1つ前の暗号文ブロック/] --> XOR  
inEncBlock[/暗号文ブロック/] --> 復号  
--> XOR --> outPlanBlock[/平文ブロック/]  

初期化ベクトル

  • IV(initialization vector) と省略する。
  • 長さは1ブロック。
  • 最初の「平文ブロックの暗号化/暗号文ブロックの復号」を行うときは「1つ前の暗号文ブロック」がないため、代わりに IV と XOR を取る。
  • IV は暗号化のたびに異なるランダムな値を使うこと。
    • 毎回同じ IV だと、同じ鍵と平文による暗号化の結果が同じになる。

      全く同じ暗号文を手に入れた攻撃者は、暗号を解読しなくても「この暗号文の平文は同じだ」と分かってしまう。

graph TD  

IV[/初期化ベクトルIV/] --> XOR1[XOR]  
planBlock1[/平文ブロック1/] --> XOR1[XOR]  
--> enc1[暗号化] --> encBlock1[/暗号文ブロック1/]  

暗号化の構造

1つ前の暗号文ブロックと平文ブロックの XOR を取ってから暗号化を行う。

平文ブロック1, 2が同じ値でも、暗号文ブロック1, 2が等しいとは限らない。
(暗号文ブロック1にはIVが影響し、暗号文ブロック2には暗号文ブロック1が影響するため)

graph TD  
%% 暗号文ブロックからXORへの線がないが、つけると図が崩れるため画像にする  

subgraph 平文  
    planBlock1  
    planBlock2  
    planBlock3  
end  

subgraph 暗号文  
    encBlock1  
    encBlock2  
    encBlock3  
end  

IV[/初期化ベクトルIV/] --> XOR1[XOR]  
planBlock1[/平文ブロック1/] --> XOR1[XOR]  
--> enc1[暗号化] --> encBlock1[/暗号文ブロック1/]  

planBlock2[/平文ブロック2/] --> XOR2[XOR]  
--> enc2[暗号化] --> encBlock2[/暗号文ブロック2/]  

planBlock3[/平文ブロック3/] --> XOR3[XOR]  
--> enc3[暗号化] --> encBlock3[/暗号文ブロック3/]  

復号の構造

暗号文ブロックを復号してから、その結果と1つ前の暗号文ブロックとの XOR を取る。

graph TD  

subgraph 平文  
    planBlock1  
    planBlock2  
    planBlock3  
end  

subgraph 暗号文  
    encBlock1  
    encBlock2  
    encBlock3  
end  

IV[/初期化ベクトルIV/] --> XOR1[XOR]  
encBlock1[/暗号文ブロック1/] --> dec1[復号]  
--> XOR1[XOR] --> planBlock1[/平文ブロック1/]  
encBlock1 --> XOR2[XOR]  

encBlock2[/暗号文ブロック2/] --> dec2[復号]  
--> XOR2[XOR] --> planBlock2[/平文ブロック2/]  
encBlock2 --> XOR3[XOR]  

encBlock3[/暗号文ブロック3/] --> dec3[復号]  
--> XOR3[XOR] --> planBlock3[/平文ブロック3/]  

CBC のまとめ

  • 初期化ベクトルIVが必要
    • IVは暗号化/復号どちらにも同じ値であること
    • IVが異なれば同じ鍵でも異なる出力になる
  • 入力の一部が異なれば、全体が異なる出力になる

参考

  • 結城浩(2015)『暗号技術入門 第3版』