PHP7+中如何使用openssl替代mcrypt进行AES加密解密

 4869

本篇文章给大家介绍一下php7+中使用openssl替代mcrypt进行AES加密解密的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。


PHP7+中如何使用openssl替代mcrypt进行AES加密解密


mcrypt十年过去,现在php7+中已经开始淘汰。官方给出掉提示:

mcrypt_get_block_size — 获得加密算法的分组大小 


Warning

This 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版本代码

  1. class AES {
  2.     public static function encrypt($input,$key) {
  3.         $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
  4.         $paddedData = static::pkcs5_pad($input, $blockSize);
  5.         $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
  6.         $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
  7.         $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $paddedData, MCRYPT_MODE_ECB, $iv);
  8.         return bin2hex($encrypted);
  9.  
  10.     }
  11.     private static function pkcs5_pad ($text, $blocksize) {
  12.         $pad = $blocksize - (strlen($text) % $blocksize);
  13.         return $text . str_repeat(chr($pad), $pad);
  14.     }
  15.     public static function decrypt($sStr,$key) {
  16.         $decrypted= mcrypt_decrypt(
  17.             MCRYPT_RIJNDAEL_128,
  18.             $key,
  19.             hex2bin($sStr),
  20.             MCRYPT_MODE_ECB
  21.             );
  22.         $dec_s = strlen($decrypted);
  23.         $padding = ord($decrypted[$dec_s-1]);
  24.         $decrypted = substr($decrypted, 0, -$padding);
  25.         return $decrypted;
  26.     }
  27.     /**
  28.      *url 安全的base64编码 sunlonglong
  29.      */
  30.     function base64url_encode($data) {
  31.         return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  32.     }
  33.     /**
  34.      *url 安全的base64解码 sunlonglong
  35.      */
  36.     function base64url_decode($data) {
  37.         return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
  38.     }
  39. }
  40.  
  41. $key = 'g87y65ki6e8p93av8zjdrtfdrtgdwetd';
  42. $encrypt = AES::encrypt('123abc',$key);
  43. $decrypt = AES::decrypt($encrypt,$key);
  44. var_dump($encrypt,$decrypt);

加密结果:

  1. da07f6363eb0024b4bdd264e5fd4a2f5


下面是php7以上。使用openssl加密:

  1. class AES {
  2.  
  3.     /**
  4.      *
  5.      * @param string $string 需要加密的字符串
  6.      * @param string $key 密钥
  7.      * @return string
  8.      */
  9.     public static function encrypt($string, $key)
  10.     {
  11.  
  12.         // openssl_encrypt 加密不同Mcrypt,对秘钥长度要求,超出16加密结果不变
  13.         $data = openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
  14.  
  15.         $data = strtolower(bin2hex($data));
  16.  
  17.         return $data;
  18.     }
  19.  
  20.  
  21.     /**
  22.      * @param string $string 需要解密的字符串
  23.      * @param string $key 密钥
  24.      * @return string
  25.      */
  26.     public static function decrypt($string, $key)
  27.     {
  28.         $decrypted = openssl_decrypt(hex2bin($string), 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
  29.  
  30.         return $decrypted;
  31.     }
  32. }
  33.  
  34.  
  35. $encrypt = AES::encrypt('123abc', 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
  36. $decrypt = AES::decrypt($encrypt, 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
  37. var_dump($encrypt,$decrypt);die;

加密结果:

  1. 8c927c42f93a83c5de763aa18e4e6c7d


虽然key长度32位,但是openssl_encrypt加密时候,key长度只使用了16长度,后面未参加签名,而mcrypt_encrypt会整个key参与加密,这样就会出现加密出来对结果不一致。造成困惑,key=g87y65ki6e8p93av8zjdrtfdrtgdwetd与key=g87y65ki6e8p93av结果都是一致对;


本文网址:https://www.zztuku.com/detail-8903.html
站长图库 - PHP7+中如何使用openssl替代mcrypt进行AES加密解密
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐