当IV不需要时,PHP的mcrypt_get_iv_size实际上会返回零吗?

问题描述:

PHP documentation for mcrypt_get_iv_size中指出,返回值将是零,当算法/块模式组合不使用IV:当IV不需要时,PHP的mcrypt_get_iv_size实际上会返回零吗?

返回初始化向量(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函数)。

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

更新与可能的解决方法:

看着它好像mcrypt_enc_get_iv_size()将始终返回任何块加密模式的块大小libmcrypt来源,但回落到“问”为流算法模式。

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

你是对的,欧洲央行不使用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是奇数。故意与否,你应该忽视它。

+1

我不能简单地忽略它,因为单独的ECB并不是一个可靠的指示器,是否需要IV(文档中的其他地方指出某些密码在使用流模式时需要IV)。我想我会提交一份PHP错误报告,看看他们是否倾向于更改代码或文档:)。谢谢您的回复。 – jmalloc 2012-07-25 02:41:59

+1

欧洲央行作为区块模式是一个可靠的指标。你使用ECB来实现另一种模式并不会改变这个事实。 – 2012-07-25 07:49:41

+1

请注意,我全部都是为了更改方法和/或文档的结果,尽管我会选择返回-1来创建快速失败的情况。 – 2012-07-25 07:57:17