当不需要IV时,PHP的mcrypt_get_iv_size是否实际返回零?

jma*_*loc 5 php encryption mcrypt

mcrypt_get_iv_sizePHP文档中,声明当算法/块模式组合不使用IV时,返回值将为零:

以字节为单位返回初始化向量(IV)的大小.出错时,函数返回FALSE.如果在指定的密码/模式组合中忽略IV,则返回零.

当我用MCRYPT_DES作为算法和MCRYPT_MODE_ECB作为模式调用此函数时,它返回8(8)而不是预期的0(零).

我的理解是,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;
Run Code Online (Sandbox Code Playgroud)

请注意,我实际上并没有将ECB用于实际加密,我只是想找到一种可靠的方法来确定任意算法/模式是否需要IV.(我注意到mcrypt库有一个函数"mcrypt_enc_mode_has_iv",但似乎没有等效的PHP函数).

我正在使用PHP v5.3.12和libmcrypt 2.5.8_1.

更新可能的解决方法:

看看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);
    }
}
Run Code Online (Sandbox Code Playgroud)

mcrypt_get_algo_iv_size()调用被转发到算法库的_mcrypt_get_algo_iv_size()函数.所以希望这意味着如果我手动处理ECB情况,它应该为那些需要IV流模式的算法产生正确的结果.

kba*_*kba 1

你是对的,ECB 不使用 IV,正如PHP 文档mcrypt_get_iv_size中也指出的那样:

常量之一MCRYPT_MODE_modename,或以下字符串之一:“ecb”、“cbc”、“cfb”、“ofb”、“nofb”或“stream”。IV 在 ECB 模式下被忽略,因为该模式不需要它。在加密和解密阶段,您需要具有相同的 IV(认为:起点),否则您的加密将失败。

为什么mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB)返回 8 很奇怪。不管是有意还是无意,你都应该忽略它。