使用函数mcrypt_cbc()在PHP中获取错误

时间:2011-02-27 10:50:08

标签: php encryption mcrypt

我正在使用这个加密数据的功能:

function encryptCredential($data) {
$key = '9cqkTFHOfOmKn8kt&NSlIK*XMRWWx*tNY$azRdEvm2to*AQOll%8tP18g35H!zNg9l85pgnww$&q6y@1WrWZhKhx&23acq^*FWf*xdnmI%7aWwM6JQLm%tzYG^*8PIh1zD@D5QKa98Gg';
$encryptedData = mcrypt_cbc(MCRYPT_TripleDES, substr($key,0,32), pad($data), MCRYPT_ENCRYPT, substr($key,32,16));
return base64_encode($encryptedData);
}

PHP然后给了我这个警告:

PHP Warning:  mcrypt_cbc() [<a href='function.mcrypt-cbc'>function.mcrypt-cbc</a>]: The IV parameter must be as long as the blocksize in /home/xxxxx/public_html/libraries/global.inc.php on line xx

我的钥匙太长了吗?应该有多少个字符?

4 个答案:

答案 0 :(得分:1)

您应该在找到它们时注意弃用警告。

也就是说,TripleDES的块大小是8个字节,但是你为IV提供了16个字节。将您的substr($key,32,16)更改为substr($key,32,8),它应该有效。

但我仍然建议转移到新的API。

答案 1 :(得分:1)

块大小,以及IV大小,是8个字节。密钥大小为24字节。

您可以使用mcrypt_get_iv_sizemcrypt_get_key_size获取此信息。

在CBC模式下,对于每个加密消息,IV必须是唯一且不可预测的。使用mcrypt_create_iv(8)创建合适的一个。它不一定是秘密的,因此可以与加密的消息一起存储。

答案 2 :(得分:0)

您正在使用的功能似乎已被删除,请参阅http://se2.php.net/manual/en/function.mcrypt-cbc.php

  

不应再使用此函数,请参阅mcrypt_generic()和mdecrypt_generic()以进行替换。

尝试使用这些功能,看看是否仍然出现错误

答案 3 :(得分:0)

感谢所有帮助。我将在稍后修复IV,但这是我的新功能,对于任何人看到此页面并需要它们:

`//启动encryptCredential函数 function encryptCredential($ data){ $ key ='9cqkTFHOfOmKn8kt&amp; NSlIK * XMRWWx * tNY $ azRdEvm2to * AQOll%8tP18g35H!zNg9l85pgnww $&amp; q6y @ 1WrWZhKhx&amp; 23acq ^ * FWf * xdnmI%7aWwM6JQLm%tzYG ^ * 8PIh1zD @ D5QKa98Gg'; $ cipher = mcrypt_module_open(MCRYPT_blowfish,'','cbc',''); mcrypt_generic_init($ cipher,substr($ key,8,56),substr($ key,32,8)); $ encrypted = mcrypt_generic($ cipher,pad($ data)); mcrypt_generic_deinit($密码); return base64_encode($ encrypted); } // end encryptCredential function

//启动decryptCredential函数 function decryptCredential($ data){ $ encryptedData = base64_decode($ data); $ key ='9cqkTFHOfOmKn8kt&amp; NSlIK * XMRWWx * tNY $ azRdEvm2to * AQOll%8tP18g35H!zNg9l85pgnww $&amp; q6y @ 1WrWZhKhx&amp; 23acq ^ * FWf * xdnmI%7aWwM6JQLm%tzYG ^ * 8PIh1zD @ D5QKa98Gg'; $ cipher = mcrypt_module_open(MCRYPT_blowfish,'','cbc',''); mcrypt_generic_init($ cipher,substr($ key,8,56),substr($ key,32,8)); $ decrypted = unpad(mdecrypt_generic($ cipher,$ encryptedData)); mcrypt_generic_deinit($密码); return $ decrypted; } //结束decryptCredential function`