• 技术文章 >后端开发 >PHP7

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

    醉折花枝作酒筹醉折花枝作酒筹2021-05-28 09:12:10转载100
    本篇文章给大家介绍一下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版本代码

    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加密解密的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    上一篇:PHP7下如何安装并使用xhprof性能分析工具 下一篇:PHP7如何使用set_error_handler和set_exception_handler处理异常机制
    第16期线上培训班

    相关文章推荐

    • 有关于PHP数组的进一步了解!!!• php中yield的用法是什么• php怎么将字符串转换boolean类型• php怎么获取数组前几位数据• 在linux上搭建php环境的方法

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网