初期化ベクトルとは
初期化ベクトルはinitialization vector、略してIVと呼ばれています。まずは初期化ベクトルとは何か、その概要を見ていきましょう。
データを解読しにくくするランダムなビット列のこと
同じデータを常に同じ暗号文に置き換えると、その頻度から暗号化される前の元のデータが推測されてしまいます。そのため、同じデータでも違う暗号文に置き換える仕組みが必要です。
そこで用いられるのが初期化ベクトルです。初期化ベクトルはランダムに生成されるビット列であり、これを利用することで暗号化の結果を毎回変えられます。具体的にどのような形式で初期化ベクトルが用いられるかは、暗号化アルゴリズムによって異なります。
初期化ベクトルはそのためだけに使われるデータであり、初期化ベクトルから元のデータを予測することは不可能です。したがって、初期化ベクトルは第三者に知られても問題ありません。
ブロック暗号とストリーム暗号で使用される
初期化ベクトルはブロック暗号やストリーム暗号で使われます。では、それぞれにおける初期化ベクトルの使われ方を見ていきましょう。
ブロック暗号:最初のブロックまたは平文の前に設置
ブロック暗号とは、ある程度まとまった長さのデータを一括処理する暗号アルゴリズムです。たとえば、ブロック暗号として有名なAESでは128・192・256bitのデータをまとめて暗号化します。データが一定量たまってから処理するため、遅延が生じる反面、処理の負荷が小さくなります。
ブロック暗号では、モードと呼ばれるルールに従って暗号化が行われます。いくつかあるモードの中で、初期化ベクトルが使われる代表的なモードがCBCモードです。
CBCモードでは、ある平文を暗号化する際、その平文と直前のブロックの暗号文の排他的論理和を暗号化の結果とします。排他的論理和は論理演算の一種です。つまり、暗号化結果を算出するには、直前のブロックの情報が必要ということです。
ところが、一番初めのデータは参照すべき直前のブロックがありません。そこで代理のブロックとして使われるのが初期化ベクトルです。初期化ベクトルを毎回変えることで暗号化の結果も変わります。
ストリーム暗号:ビットの出力前に初期値として設定
ストリーム暗号はブロック暗号とは対照的に、データを1ビットあるいは1バイトずつ処理する暗号アルゴリズムです。効率はブロック暗号に劣りますが、処理速度が優れているため、無線LANの暗号化方式にも使われています。
ストリーム暗号では、疑似乱数生成器から得た乱数を使って平文を暗号化します。その乱数を生成する際に、元となるのがシードと初期化ベクトルです。シードは乱数を生み出す材料のようなものです。疑似乱数生成器をミキサーに例えるなら、シードは果物に当たります。
しかし、シードが毎回同じであれば、得られる乱数も同じになります。そこで、シードだけでなくランダムなビット列である初期化ベクトルを加えることで、得られる乱数を毎回変えるのです。
初期化ベクトルとソルトの違い
初期化ベクトルと似たものにソルトがあります。
ソルトはパスワードをハッシュ化する際に、パスワードの前後に付加する文字列のことです。また、ハッシュ化とは不可逆的にデータを変換することです。ソルトを付加することで、ハッシュ化前のパスワードが第三者に推測されるのを防ぎます。
初期化ベクトルとソルトは、変換されたデータの平文を推測されにくくするための文字列である点では同じです。しかし、初期化ベクトルで複雑化された暗号文は、あくまでも後に復号できるものでなければなりません。一方、ソルトは復号を困難にするために使われます。
初期化ベクトルの生成方法
共通鍵暗号方式で暗号化するケースを例に、初期化ベクトルの生成方法を見ていきましょう。
まず、初期化ベクトル(iv)は以下のコードで生成できます。
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte[]_iv = new byte[16];
random.nextBytes(iv);
上記のコードで得られた初期化ベクトルを使い、以下のコードで暗号化します。
byte[] encrypt(byte[] plainText, byte[] key, byte[] iv, enum cipherMode)
「plainText」は平文、「key」は鍵、「iv」が初期化ベクトル、「cipherMode」がモードです。これらを与えて出力される値が暗号文です。
初期化ベクトルについて知り、セキュリティ意識を向上!
初期化ベクトルとは、暗号化の解読を困難にするためのランダムな文字列です。以下のような形式で使われます。
- ブロック暗号
- 最初のデータブロックの暗号化結果を変える
- ストリーム暗号
- 疑似乱数生成器から生成される乱数を変える
初期化ベクトルは解読を困難にするために使われますが、あくまで復号される前提です。不可逆的に変換するソルトとはその点で異なります。以上を参考にして、セキュリティへの意識を高めてください。