在PHP documentation for mcrypt_get_iv_size中,当算法/块模式组合不使用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;
请注意,我实际上并没有将ECB用于实际加密,我只是想找到一种可靠的方法来确定任意算法/模式是否需要IV。 (我注意到mcrypt库有一个函数&#34; mcrypt_enc_mode_has_iv&#34;,但似乎没有等效的PHP函数。)
我使用PHP v5.3.12和libmcrypt 2.5.8_1。
更新可能的解决方法:
查看libmcrypt源,似乎mcrypt_enc_get_iv_size()将始终返回任何分组密码模式的块大小,但是回退到&#34;询问&#34;流模式的算法。
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的算法产生正确的结果。
答案 0 :(得分:1)
你是对的,欧洲央行不使用IV,因为PHP documentation for mcrypt_get_iv_size
中也指出了这一点:
MCRYPT_MODE_modename
常量之一,或以下字符串之一:“ecb”,“cbc”,“cfb”,“ofb”,“nofb”或“stream”。 在ECB模式下忽略IV,因为此模式不需要它。在加密和解密阶段,您需要具有相同的IV(思考:起点),否则您的加密将失败。
为什么mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB)
返回8是奇怪的。无意或无意,你应该忽视它。