mcrypt_get_iv_sizeのPHP ドキュメントでは、アルゴリズムとブロック モードの組み合わせが IV を使用しない場合、戻り値はゼロになると記載されています。
初期化ベクター (IV) のサイズをバイト単位で返します。エラーの場合、関数は FALSE を返します。指定された暗号/モードの組み合わせで IV が無視される場合、0 が返されます。
MCRYPT_DES をアルゴとして、MCRYPT_MODE_ECB をモードとしてこの関数を呼び出すと、予想される 0 (ゼロ) ではなく 8 (8) が返されます。
ECB は IV を使用せず、また使用できないことを理解しているため、ゼロ値が期待されます。これは間違っていますか、ドキュメントが間違っていますか、それとも他に何か不足していますか?
次のスニペットは、問題を示しています。
<?php
// I expect this call to return zero.
$size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);
echo 'IV Size: ' . $size . PHP_EOL;
私は実際には実際の暗号化に ECB を使用していないことに注意してください。任意のアルゴリズム/モードで IV が必要かどうかを判断するための信頼できる方法を見つけようとしているだけです。(mcrypt ライブラリには関数 "mcrypt_enc_mode_has_iv" があることに気付きましたが、同等の PHP 関数はないようです)。
libmcrypt 2.5.8_1 で PHP v5.3.12 を使用しています。
可能な回避策で更新します。
libmcrypt のソースを見ると、mcrypt_enc_get_iv_size() は常にブロック暗号モードのブロック サイズを返すように見えますが、ストリーム モードのアルゴリズムを "尋ねる" ことに戻ります。
int mcrypt_enc_get_iv_size(MCRYPT td)
{
if (mcrypt_enc_is_block_algorithm_mode(td) == 1) {
return mcrypt_enc_get_block_size(td);
} else {
return mcrypt_get_algo_iv_size(td);
}
}
mcrypt_get_algo_iv_size() 呼び出しは、アルゴリズム ライブラリの _mcrypt_get_algo_iv_size() 関数に転送されます。したがって、これは、ECB ケースを手動で処理すると、ストリーム モードで IV を必要とするアルゴリズムに対して正しい結果が得られることを意味します。