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

时间:2012-07-25 01:42:11

标签: php encryption mcrypt

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的算法产生正确的结果。

1 个答案:

答案 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是奇怪的。无意或无意,你应该忽视它。