本篇文章给大家介绍一下php7+中使用openssl替代mcrypt进行aes加密解密的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
mcrypt十年过去,现在php7+中已经开始淘汰。官方给出掉提示:
mcrypt_get_block_size — 获得加密算法的分组大小warningthis function has been deprecated as of php 7.1.0. relying on this function is highly discouraged.
在php7中需要openssl替代,这里需要注意的是:
在mcrypt中对加密key长度没有限制要求,传入多少长度都会参加加密,但是在openssl_encrypt中。key长度只能是16长度,>16长度后,签名结果保持不变,这里是哥坑,在替代方案测试时候容易出错,具体直接上代码对比:
低于php7版本代码
class aes { public static function encrypt($input,$key) { $blocksize = mcrypt_get_block_size(mcrypt_rijndael_128, mcrypt_mode_ecb); $paddeddata = static::pkcs5_pad($input, $blocksize); $ivsize = mcrypt_get_iv_size(mcrypt_rijndael_128, mcrypt_mode_ecb); $iv = mcrypt_create_iv($ivsize, mcrypt_rand); $encrypted = mcrypt_encrypt(mcrypt_rijndael_128, $key, $paddeddata, mcrypt_mode_ecb, $iv); return bin2hex($encrypted); } private static function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } public static function decrypt($sstr,$key) { $decrypted= mcrypt_decrypt( mcrypt_rijndael_128, $key, hex2bin($sstr), mcrypt_mode_ecb ); $dec_s = strlen($decrypted); $padding = ord($decrypted[$dec_s-1]); $decrypted = substr($decrypted, 0, -$padding); return $decrypted; } /** *url 安全的base64编码 sunlonglong */ function base64url_encode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } /** *url 安全的base64解码 sunlonglong */ function base64url_decode($data) { return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', str_pad_right)); }}$key = 'g87y65ki6e8p93av8zjdrtfdrtgdwetd';$encrypt = aes::encrypt('123abc',$key);$decrypt = aes::decrypt($encrypt,$key);var_dump($encrypt,$decrypt);加密结果: da07f6363eb0024b4bdd264e5fd4a2f5
下面是php7以上。使用openssl加密:
class aes { /** * * @param string $string 需要加密的字符串 * @param string $key 密钥 * @return string */ public static function encrypt($string, $key) { // openssl_encrypt 加密不同mcrypt,对秘钥长度要求,超出16加密结果不变 $data = openssl_encrypt($string, 'aes-128-ecb', $key, openssl_raw_data); $data = strtolower(bin2hex($data)); return $data; } /** * @param string $string 需要解密的字符串 * @param string $key 密钥 * @return string */ public static function decrypt($string, $key) { $decrypted = openssl_decrypt(hex2bin($string), 'aes-128-ecb', $key, openssl_raw_data); return $decrypted; }}$encrypt = aes::encrypt('123abc', 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');$decrypt = aes::decrypt($encrypt, 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');var_dump($encrypt,$decrypt);die;加密结果:8c927c42f93a83c5de763aa18e4e6c7d
虽然key长度32位,但是openssl_encrypt加密时候,key长度只使用了16长度,后面未参加签名,而mcrypt_encrypt会整个key参与加密,这样就会出现加密出来对结果不一致。造成困惑,key=g87y65ki6e8p93av8zjdrtfdrtgdwetd与key=g87y65ki6e8p93av结果都是一致对;
推荐学习:php视频教程
以上就是php7+中如何使用openssl替代mcrypt进行aes加密解密的详细内容。