![](/img/trans.png)
[英]Is mcrypt_encrypt() function not working in PHP 7.2?
[英]mcrypt_encrypt not working properly on PHP 5.6.9
我有以下代碼在PHP 5.5.9上運行良好。
function index()
{
echo $this->encryptText_3des('TEST','JHHKJH9879');
}
function encryptText_3des($plainText, $key) {
$key = hash("md5", $key, TRUE);
for ($x=0;$x<8;$x++) {
$key = $key.substr($key, $x, 1);
}
$padded = $this->pkcs5_pad($plainText,
mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC));
return $encrypted;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
加密發生得很好。但是在5.6.9中,在mcrypt_encrypt的PHP文檔中,他們提到了
不再接受無效的密鑰和iv尺寸。 mcrypt_encrypt()現在將拋出警告,如果輸入無效,則返回FALSE。 以前,鍵和IV用'\\ 0'字節填充到下一個有效大小。
如何在不改變加密算法的情況下使用第五個參數修改當前代碼?
我試過了
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
給$ iv作為第五個參數。
但它沒有成功。 加密與早期加密不同。
找到答案,以防任何人需要
$ivSize = 8;
$iv = str_repeat("\0", $ivSize);
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC, $iv));
手動傳遞第5個參數,這是早期版本自己做的!
我會建議你不要重新發明輪子,因為你的功能有許多加密工程缺陷。
MCRYPT_RIJNDAEL_128
。 麥克瑞特非常可怕 。 md5()
作為密鑰派生函數。 如果您發現自己需要KDF(例如,因為您使用的是密碼而不是存儲加密密鑰),請使用帶有SHA-256的hash_pbkdf2()
。 如果您要使用mcrypt(我們在PHP中使用安全數據加密的建議是使用libsodium,如果可以;否則化解/ php-encryption ;否則打開),請確保將正確的常量傳遞給mcrypt_create_iv()
。
壞 :
$iv = mcrypt_create_iv(16, MCRYPT_RAND); // BAD EXAMPLE
好的 :
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); // YES!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.