PHP';当不需要iv时,s mcrypt_get_iv_size实际上返回零


Does PHP's mcrypt_get_iv_size actually return zero when the IV is not required?

在mcrypt_get_iv_size的PHP文档中指出,当算法/块模式组合不使用iv:时,返回值将为零

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

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

据我所知,欧洲央行没有也不能使用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 v.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流模式的算法产生正确的结果。

您是对的,ECB没有使用IV,mcrypt_get_iv_size:的PHP文档中也指出了这一点

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

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