ちりもつもればミルキーウェイ

好奇心に可処分時間が奪われる

ブロック暗号のCBCモードについてざっと調べた

はじめに

以前EBCモードかいて、CBCについて興味が出たので調べてみた
そのうち実装もしてみたいけど今回はとりあえずやってることとかを理解するに留める

CBCってなにやってるの

ブロック暗号の暗号利用モードは、与えられたブロックをどう暗号化処理に引き渡していくかの方式の違いと考えて問題ないはず
EBCではとくになにもしないで与えられたブロックを指定された暗号化アルゴリズムに引き渡すだけ

ではCBCはどうやるの?というのはやることとしてはすごく簡単でencryptのときは

  1. 先頭ブロックは1ブロック長分の初期化ベクトルivを生成して自身のブロックの平文とxorをとる。その値を暗号化する
  2. 次移行のブロックは、一つ前のブロックの暗号結果と自身のブロックの平文のxorをとって暗号化
  3. 以下ブロックがなくなるまで繰り返し

というかんじ。CBCという言葉自体 Cipher Block Chaining という意味で、ブロックが鎖のようにつながってる感じなので言葉まんまの処理

処理の流れをみればわかるけど、性質上並列で処理することは不可能(前ブロックの処理結果を要求するので、処理順に依存性がある)

EBCは決定的アルゴリズムなので入力がきまると出力も定まるけど、それだとbool値のような入力値のパターンが少ないときに悪い人に暗号文を盗聴されると「どう暗号化してるかは全然わからんがなんか結果が2パターンしか無いしどっちかやろ!」みたいに推察されちゃうから危ないよね!というはなし

なので非決定アルゴリズムにしたいぞ!となって考えられたのがCBC。内部で採番するランダムな値で先頭ブロック平文を加工しつつ、後続ブロックもその影響をうける形で加工してから暗号化すればパターンが少ない平文の暗号化でも内容が推察されないよな!という考え

暗号化時に内部でかってにivを採番するから、そのivをdecryptしたい人にもわたしてあげないと復号できなくなっちゃうので、大体暗号文の先頭1ブロックにivをつめてあげる実装が多い. ivをどのように連携するかは仕様とかは決まってないみたい?

ivが先頭1ブロックにあるとすると、decryptは以下のながれ

  1. 暗号文の先頭1ブロックからivを取り出す
  2. iv以外の暗号文から一番最初のブロックを取り出して復号する。そうすると平文とivのxorがでる。同じ値と2回xorとるともとに戻るから、ivとのxorをまたとる。これで平文でる
  3. 残りのブロックは、復号したあと一個前のブロックの平文とivのxorでxorとる。そうすると平文が出る

ivって先頭1ブロックにいれるとバレちゃうけどいいの?

いいはず
ivがわかったところで秘密鍵もってないと復号できない。バレたところでどっちみち復号できない

ivをランダムにふることで非決定アルゴリズムにするのがCBCだから、ivバレるとパターンわかっちゃうんじゃ?とおもうかもだけど、そもそも復号できないとivと先頭1ブロックのxorがとれないから後続のブロックのxorもとれない。一回復号できないとivによってどのように値がバラけてるのか推定できないので、結局利用する暗号が解けないと無理。