• PHP7.* AES的加密解密


    之前写过一篇:

    PHP AES的加密解密-----【弃用】

    使用的是php5.*之前的mcrypt_decrypt 函数,该函数已经在php7.1后弃用了,上马的是openssl的openssl_encrypt,openssl_decrypt。

    上期回顾

    在php7.* 环境执行之前代码:

    <?php
    
    define('SECRETKEY', '12f862d21d3ceafba1b88e5f22960d55');
    
    /**
     * 加密方法
     * @param string $str
     * @return string
     */
    function encrypt($str) {
        //AES, 128 ECB模式加密数据
        
       
        $str = addPKCS7Padding($str);
        
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);  # MCRYPT_RAND 随机, 固定为 16个0
        define('A', $iv);
        $encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, SECRETKEY, $str, MCRYPT_MODE_CBC, $iv);
        return base64_encode($encrypt_str);
    }
    
    /**
     * 解密方法
     * @param string $str
     * @return string
     */
    function decrypt($str) {
        //AES, 128 ECB模式加密数据
        $str = base64_decode($str);
        $encrypt_str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, SECRETKEY, $str, MCRYPT_MODE_CBC,A);
        $encrypt_str = stripPKSC7Padding($encrypt_str);
        return $encrypt_str;
    }
    
    /**
     * 填充算法
     * @param string $source
     * @return string
     */
    function addPKCS7Padding($source) {
        $source = trim($source);
        $block = mcrypt_get_block_size('rijndael-128', 'cbc');
        $pad = $block - (strlen($source) % $block);
        if ($pad <= $block) {
            $char = chr($pad);
            $source .= str_repeat($char, $pad);
        }
        return $source;
    }
    
    /**
     * 移去填充算法
     * @param string $source
     * @return string
     */
    function stripPKSC7Padding($source) {
        $char = substr($source, -1);
        $num = ord($char);
        $source = substr($source, 0, -$num);
        return $source;
    }
    
    
    
    
    /**
     *  加密
     */
    $string =encrypt('Hello, world!');
    print_r($string);
    echo '<hr>';
    /**
     *  解密
     */
    $string=decrypt($string);
    print_r($string);

    打印:

    Deprecated: Function mcrypt_get_block_size() is deprecated in /home/wwwroot/web/html/php/a.php on line 42
    
    Deprecated: Function mcrypt_get_iv_size() is deprecated in /home/wwwroot/web/html/php/a.php on line 16
    
    Deprecated: Function mcrypt_create_iv() is deprecated in /home/wwwroot/web/html/php/a.php on line 16
    
    Deprecated: Function mcrypt_encrypt() is deprecated in /home/wwwroot/web/html/php/a.php on line 18
    HUou9juETJVsWw8RxA8qkKH1+zf5zy283ApG6yzW/rU=
    
    Deprecated: Function mcrypt_decrypt() is deprecated in /home/wwwroot/web/html/php/a.php on line 30
    Hello, world!

    看看php官网的解释:http://php.net/manual/zh/function.mcrypt-encrypt.php

     那句话怎么说的“mcrypt_decrypt要靠php自我奋斗,但也要考虑历史的进程。”,时代不一样了openssl当道啦!

    openssl的加密解密

    之前我们用mcrypt_decrypt 实现的代码,现在openssl两行代码就能实现。

    /**
     * openssl 实现
     */
    define('KEY', '12f862d21dcfeafb57bckfrrt5yuiopf');
    $iv= md5(time(). uniqid(),true);
    $str="Hello, world!";
    # 加密 md5->true 为16位md5
    echo $strEncode= base64_encode(openssl_encrypt($str, 'AES-128-CBC',KEY, OPENSSL_RAW_DATA , $iv));   # AES-256-CBC
    
    /**
     * 解密
     */
    echo "<hr>";
    echo openssl_decrypt(base64_decode($strEncode), 'AES-128-CBC', KEY, OPENSSL_RAW_DATA, $iv);

     打印结果:

    注意!

     上面代码有没有发现问题:

    偏移向量iv的长度必须为16位,比如整个19位回报错:

    Warning: openssl_encrypt(): IV passed is 19 bytes long which is longer than the 16 expected by selected cipher,

    method 长度的问题,密码学方式我们用的最多的有两种,AES-128-CBC 与 AES-256-CBC

    上节我们讲过字符串的长度问题

    1 bit 位    = 1  二进制数据
    1 byte 字节  = 8  bit
    1 字母 = 1  byte = 8 bit
    
    128位/8=16字节=16字符
    192位/8=24字节=24字符
    256位/8=32字节=32字符

    也就是说KEY 的长度是根据AES-128-CBC 与 AES-256-CBC 变换的。使用 AES-128-CBC 时,key的长度应该为16位,使用 AES-256-CBC时,key的长度应该为32位。

    当然了,如果key长度大于限定方式,也无所谓,不是我说无所谓,是php在处理的时候只截取实际的长度。如果长度不够php也会使用‘x00’填补。

    所以上面的代码key长度是错误的,因为用的是AES-128-CBC,所以key长度应该为16位。对! 我就是故意的。

  • 相关阅读:
    module(JS模块系统)
    Sass 教程
    Vue编写的页面部署到springboot网站项目中出现页面加载不全问题
    vue安装教程
    李大庆 软件工程 课后作业(一) 自我介绍
    课后作业(一)
    软工假期预习作业1
    浅谈C#中 加密方式
    C# 日志帮助类
    开荒笔记---UML类图之间的几种关系介绍
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4610649.html
Copyright © 2020-2023  润新知