暗号利用モードのECBとCBCを試したり。(自作版とライブラリ版両方あるよ)

教科書やウィキペに書いてあることをPythonで検証

セキュリティを学んでいると必ず学ぶことになるであろう"暗号利用モード".
簡単に説明すると, ブロック暗号を使って安全にデータを暗号化・復号化するための手法や手順を定めた方式のことらしいです.
私は初学者なので, 教科書やWikipediaを見るだけに止まず, 実際に作って学んでみることにしました.


前置き

今回はECBモードとCBCモードをイジイジしてみる.

モード 備考
ECB 最も単純. それぞれのブロックを独立して暗号化する. そのせいでデータのパターンが隠蔽されない.
CBC 初期化ベクトルとXOR演算を使うことで, ECBの欠点を克服している. 広く用いられているらしい.

pythonのライブラリで既に実装はされているようなので, 自分でも実装してみて比較もしてみます.
ウィキペにもあったので, 見た目で分かりやすい画像を暗号化することにしました.
形式は一番単純なbmpをチョイス.
mspaintで以下の画像を作りました.

ひどい画像ですが, ご勘弁を….

コードと出力結果

コードはこちらに置いてます.
https://github.com/tsolsikke/block-cipher-modes

お楽しみの出力結果ですが, 以下のようになりました.

やはりというか当たり前なのでしょうが, 両者ともECBモードは輪郭がハッキリと分かります.
意外だったのは, 自作したCBCモードでは微妙にパターンが残っているように見える点です.
cryptgraphyライブラリを使用したほうでは, 完全にノイズしか見えません.

これも当たり前ですが, 暗号化するにあたってはちゃんと既存のライブラリを使ったほうが安全ですね.
あくまでも学習目的ということで.


あとがき

いろいろいじってみたのですが, なぜ自作CBCにパターンが残ってしまうのか謎でした.

ちなみに, “暗号化"するということは"復号"が出来なければ意味がない! ということで, 復号処理も実装しています.
忘れがちですが, 重要ですよね.