我写了一个代码来用mcrypt加密数据。当我创建一个 IV 时它可以工作,但是当我解密它时,解密的文本与以前不同,它给了我这个错误:
Warning: mcrypt_decrypt(): The IV parameter must be as long as the blocksize
这是我创建 IV 时的代码:
$iv = mcrypt_create_iv(mcrypt_get_iv_size($algo, $type), MCRYPT_RAND);
问题还在于它给出了一个带有不可读字符的字符串。
这是我加密时的代码:
trim(base64_encode(mcrypt_encrypt($algo, $pass,
$data, $type, $iv)));
这是用于解密的:
trim(mcrypt_decrypt($algo, $pass,
base64_decode($data), $type, $iv));
问题:为什么它不能解密,所以我得到明文,为什么它给我一个错误。
编辑:当我使用 EMPTY IV 时,它可以工作并且我得到明文,但它仍然给我错误:
Warning: mcrypt_xxxxxx(): The IV parameter must be as long as the blocksize
我写了一个代码来用mcrypt加密数据。
这从来都不是好兆头。(强调我的。
当我创建一个 IV 时它可以工作,但是当我解密它时,解密的文本与以前不同,它给了我这个错误:
Warning: mcrypt_decrypt(): The IV parameter must be as long as the blocksize
这是我创建 IV 时的代码:
$iv = mcrypt_create_iv(mcrypt_get_iv_size($algo, $type), MCRYPT_RAND);
你知道MCRYPT_RAND
是什么意思吗?这意味着rand()
,一个不安全的随机数生成器。
每个需要初始化向量 (IV) 的算法都具有以下安全要求:
- 初始化向量绝不能重复。
- 初始化向量必须是不可预测的。
MCRYPT_RAND
在两个计数上都失败了:rand()
只有 2^32 个可能的输出,它是可预测的。
问题:为什么它不能解密,所以我得到明文,为什么它给我一个错误。
最简单的答案是mcrypt很糟糕,你应该使用其他东西。我的建议在这里。