【问题标题】:Does PHP's mcrypt_get_iv_size actually return zero when the IV is not required?当不需要 IV 时,PHP 的 mcrypt_get_iv_size 实际上是否返回零?
【发布时间】:2012-07-23 09:38:53
【问题描述】:

PHP documentation for mcrypt_get_iv_size中声明当算法/块模式组合不使用IV时返回值将为零:

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

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

据我了解,欧洲央行没有也不能使用 IV,因此我期望零值。这是不正确的,是文档不正确,还是我遗漏了什么?

下面的 sn-p 演示了这个问题:

<?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。

更新可能的解决方法:

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

【问题讨论】:

    标签: php encryption mcrypt


    【解决方案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 是奇数。有意无意,你应该忽略它。

    【讨论】:

    • 不幸的是,我不能简单地忽略它,因为单独的 ECB 并不是是否需要 IV 的可靠指标(在文档的其他地方,它指出某些密码在使用流模式时需要 IV) .我想我会提交一份 PHP 错误报告,看看他们是否倾向于更改代码或文档:)。感谢您的回复。
    • ECB 作为块模式是一个可靠的指标。您使用 ECB 实现另一种模式并不会改变这一事实。
    • 请注意,我完全赞成更改方法和/或文档的结果,尽管我会选择返回 -1 以创建快速失败的情况。
    • @jmalloc ECB 从不使用 IV,因此它是一个非常可靠的指标。
    • @kba 确实如此,但这不是唯一不使用 IV 的情况。一些算法在 STREAM 模式下使用 IV,而其他算法则不使用(根据文档,这里没有直接经验)。我现在根据我对问题的更新手动检查欧洲央行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多