gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:48:21 25 4
gpt4 key购买 nike

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

Returns the size of the Initialization Vector (IV) in bytes. On error the function returns FALSE. If the IV is ignored in the specified cipher/mode combination zero is returned.

当我使用 MCRYPT_DES 作为算法并使用 MCRYPT_MODE_ECB 作为模式调用此函数时,它返回 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 库有一个函数“mcrypt_enc_mode_has_iv”,但似乎没有等效的 PHP 函数)。

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

更新可能的解决方法:

查看 libmcrypt 源似乎 mcrypt_enc_get_iv_size() 将始终返回任何 block 密码模式的 block 大小,但回退到“询问”流模式的算法。

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,正如 PHP documentation for mcrypt_get_iv_size 中所指出的那样:

One of the MCRYPT_MODE_modename constants, or one of the following strings: "ecb", "cbc", "cfb", "ofb", "nofb" or "stream". The IV is ignored in ECB mode as this mode does not require it. You will need to have the same IV (think: starting point) both at encryption and decryption stages, otherwise your encryption will fail.

为什么 mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB) 返回 8 是奇数。有意无意,请无视。

关于php - 当不需要 IV 时,PHP 的 mcrypt_get_iv_size 是否实际上返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11641554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com