php – Mcrypt弃用后如何解密?
发布时间:2020-12-13 16:08:57 所属栏目:PHP教程 来源:网络整理
导读:我已将我的php版本更新为7.1. 我有使用mcrypt加密数据的功能. 现在不推荐使用此功能. 无论如何我都可以通过回到旧版本的php来解密数据. 这是我使用的代码: public function encrypt($plaintext) { $ivSize = mcrypt_get_iv_size(self::CIPHER,self::MODE);
我已将我的php版本更新为7.1.
我有使用mcrypt加密数据的功能. 现在不推荐使用此功能. 无论如何我都可以通过回到旧版本的php来解密数据. 这是我使用的代码: public function encrypt($plaintext) { $ivSize = mcrypt_get_iv_size(self::CIPHER,self::MODE); $iv = mcrypt_create_iv($ivSize,MCRYPT_DEV_URANDOM); $ciphertext = mcrypt_encrypt(self::CIPHER,$this->key,$plaintext,self::MODE,$iv); return base64_encode($iv.$ciphertext); } public function decrypt($ciphertext) { $ciphertext = base64_decode($ciphertext); $ivSize = mcrypt_get_iv_size(self::CIPHER,self::MODE); if (strlen($ciphertext) < $ivSize) { throw new Exception('Missing initialization vector'); } $iv = substr($ciphertext,$ivSize); $ciphertext = substr($ciphertext,$ivSize); $plaintext = mcrypt_decrypt(self::CIPHER,$ciphertext,$iv); return rtrim($plaintext," "); } 使用常量: const CIPHER = MCRYPT_RIJNDAEL_128; // Rijndael-128 is AES const MODE = MCRYPT_MODE_CBC; 我看到建议使用OpenSSL.这是我将从现在开始使用的.但是如何使用此方法解密旧数据? 谢谢 编辑: *编辑请求@symcbean 尝试用OpenSSL解密如下: public function decrypt($ciphertext) { $ciphertext = base64_decode($ciphertext); if (!function_exists("openssl_decrypt")) { throw new Exception("aesDecrypt needs openssl php module."); } $key = $this->key; $method = 'AES-256-CBC'; $ivSize = openssl_cipher_iv_length($method); $iv = substr($ciphertext,$ivSize); $data = substr($ciphertext,$ivSize); $clear = openssl_decrypt ($data,$method,$key,'OPENSSL_RAW_DATA'|'OPENSSL_ZERO_PADDING',$iv); return $clear; } 解决方法
需要注意的重要一点是,如果它不是块大小的倍数,则
mcrypt_encrypt 零填充输入数据.如果数据本身具有尾随零,则会导致模糊结果.
这是一个简单的例子: $data = "Lorem ipsum"; $key = "1234567890abcdef"; $iv = "1234567890abcdef"; $encrypted = mcrypt_encrypt( MCRYPT_RIJNDAEL_128,$data,MCRYPT_MODE_CBC,$iv); echo bin2hex($encrypted) . "n"; $decrypted = openssl_decrypt( $encrypted,"AES-128-CBC",OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,$iv); echo var_export($decrypted,true) . "n"; $result = rtrim($decrypted," "); echo var_export($result,true) . "n"; 输出: 70168f2d5751b3d3bf36b7e6b8ec5843 'Lorem ipsum' . " " . '' . " " . '' . " " . '' . " " . '' . " " . '' 'Lorem ipsum' (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |