仕事中にこのブログのアクセスログをチラ見していたら、、あれ?このIPってウチの会社のじゃん。

俺のアクセスか?
いや、心当たりはない。

ふむ、、パスワード暗号化の記事を読んでるのか、、

■ 日々是妄想:パスワードは暗号化しなさいよ
http://blog.livedoor.jp/katz_stlips/archives/51410853.html


って事は、我が部下のSくんだな。
てか、こんな駄文を部下に読まれるのはちょっと恥ずかしい(照

照れ隠しの気持ちもあって、思わずSくんに声を掛けた。

「Blowfishの暗号化について、なにかわかんない事ある?」

するとSくんは「えっ?」という顔をして俺を見返した。
どうやらSくんはこのブログが俺のだということに全く気付いていなかったらしく、墓穴カミングアウトしてしまいました(照

てか、直属の上司の逆ストーカー的な行為に、おそらくSくんは戦慄しただろう。
Sくんよ、スマヌ。


さて、そんなやり取りの中で「初期化ベクトルとはなにか?」という新たな問いが生まれたんだけど、実は俺も「初期化ベクトル」についてボンヤリした理解しか出来ていなかったからSくんにうまく説明が出来なかったのね。

これじゃいかん!
上司としてちゃんと指導できるようにしなければ!

ってな訳で、調べてみました。


まず、「初期化ベクトルとはなんぞや?」という話をする前に、そもそもの「暗号化」について触れておかねばなりません。

Blowfishという暗号化方式は「ブロック暗号」と呼ばれる暗号化手法を用いておりまして、暗号化する文字列データを決められたサイズごとのブロックに区切り、ブロック単位で暗号化を行うのね。
で、この「決められたサイズ」ってのは暗号化方式により定められていて、Blowfishの場合は64ビット(8バイト)になります。

上の記事の文末にて「暗号化する文字列は8の倍数桁じゃないとダメ」と書いたのは、このブロックサイズに原因があったのですよ。

てか、文字数とバイト数を混在させて書いてるのがよくないね。
正しくは「暗号化する文字列の総バイト数は8の倍数じゃないとダメ」です。

マルチバイト文字を暗号化する場合はエンコード形式に注意ね。
phpであれば、上の記事のサンプルの様に「strlen関数」でサイズを取得すればバイト数換算されます。


という事を踏まえつつ、いよいよ「初期化ベクトル」の話へ。

暗号化にてブロック処理を行う場合、「暗号利用モード」を指定する必要があります。
これは「暗号化する文字列がブロックサイズより大きい(Blowfishだと8バイトを超える)場合、どの様にデータを分割し、暗号化を施すか」を決める指定でして、数種類のモードが存在します。

つまり、
1. 文字列を8バイトごとにバラす
2. 指定された暗号化キーを使って各ブロックを暗号化する
という流れになり、この「2.」の処理の仕方が利用モードによって違うってワケ。

で、前述の記事では「CBC」という秘匿利用モードを使って暗号化をする例を書いたんだけど、この「CBC」は各ブロックの処理を
2-1. 暗号化するブロック(暗号化されていない平文)のデータに、一つ前の暗号化されたブロックデータをXOR(排他的論理和)で論理演算する
2-2. 指定された暗号化キーを使って上で算出されたXOR値を暗号化する
という手順で行うのね。

前のブロックの暗号化データが次のブロックの暗号化に使われるという、新感覚のホラー映画「ムカデ人間」を彷彿させる構造なのよ。

ムカデ人間 [DVD]
ムカデ人間 [DVD]

関連商品
ホステル3 [DVD]
アクエリアス HDリマスター版 [DVD]
ファイナル・デッドブリッジ Blu-ray & DVDセット(初回限定生産)
サンゲリア2 デジタル・リマスター版 [DVD]
ザ・ウォード 監禁病棟 [DVD]
by G-Tools


ん?
だとしたら、一番最初のブロックは何とXOR演算するの??

そう!
そこで登場するのが「初期化ベクトル」ですよ!

つまり、一番最初のブロックは「前のブロックの暗号化データ」が無いから、その代わりとして「初期化ベクトル」を与えてあげる必要があるのです。


ただそれだけの事でした。
いやはや、こんな事もキチンと理解せずに「パスワードは暗号化しなさいよ」などとほざいてたとは、、厚顔無恥も甚だしいわ!


大変勉強になりました。

上記、ブロック暗号化の説明はかなりはしょっておりますので、もっと詳しく知りたい方はアタイが拝読させていただいたこちらのサイトでお勉強しませう。

■ [暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV) - [技術資料 + 技術資料] ぺんたん info
http://pentan.info/doc/block_cipher.html


※もし理解が間違っておりましたら、コメントにてご指摘いただけると幸いです。