• php7使用openssl_encrypt函数进行AES加密


    前言

    手上有个api对接需求,要用到AES加密,要用到openssl_encrypt函数,记录一下,鉴权要求大概如下。

    1. 将明文先base64加密,后取前16位
    2. 判断字符串的字节型数据长度是否为16倍整,如不是则进行补充(PKCS#7标准
    3. 对字符串进行AES加密后base64加密,其中iv=A-16-Byte-String

    介绍

    openssl_encrypt($data, $method, $password, $options, $iv)
    
    • 1

    参数说明:

    1. $data 加密明文
    2. $method 加密方法 这里使用AES-256-CBC
    3. $passwd 加密密钥
    4. $options 数据格式选项(可选)OPENSSL_RAW_DATA , OPENSSL_ZERO_PADDING,OPENSSL_NO_PADDING
    5. $iv 密初始化向量(可选)

    实现

    将AES加密,解密(用不到),长度裁剪等功能先封装成函数

    	/**
    	* 对数据进行AES加密
    	* @param $data 明文
    	* @param $privatekey 秘钥
    	* @param $iv 密初始化向量
    	* @return 加密后的字符串
    	*/
        public static function encrypt($data, $private, $iv)
        {
        	$method='AES-256-CBC';
            return base64_encode(openssl_encrypt($data, $method, $private, OPENSSL_RAW_DATA, $iv));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    	/**
    	* 对数据进行AES解密
    	* @param $data 密文
    	* @param $privatekey 秘钥
    	* @param $iv 密初始化向量
    	* @return 解密后的字符串
    	*/
        public static function decrypt($data, $private, $iv)
        {
        	$method='AES-256-CBC';
            return openssl_decrypt(base64_decode($data), $method, $private, OPENSSL_RAW_DATA, $iv);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
        /**
         * 对需要加密的明文进行填充补位
         * @param $text 需要进行填充补位操作的明文
    	 * @param $block_size 需要的位数
         * @return 补齐明文字符串
         */
        public static function pad($text,$block_size=16)
        {
            $text_length = strlen($text);
            //计算需要填充的位数
            $amount_to_pad = $block_size - ($text_length % $block_size);
            if ($amount_to_pad == 0) {
                $amount_to_pad = $block_size;
            }
            //获得补位所用的字符
            $pad_chr = chr($amount_to_pad);
            $tmp = "";
            for ($index = 0; $index < $amount_to_pad; $index++) {
                $tmp .= $pad_chr;
            }
            return $text . $tmp;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    实现

     $data='hello world';
     $private='dfgdfhdhdfh';
     $iv='A-16-Byte-String';
    
     //截取前16位
     $data= substr($data, 16);
     //判断字符串的字节型数据长度是否为16倍整,不是进行补充
     $data= self::pad($data);
     //调加密方法
     $AES_en_str = self::encrypt($data, $private, $iv);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2022-11-23补充:看网上资料,当openssl_encrypt的options=OPENSSL_RAW_DATA,会自动对字符串进行16位的PKCS#7标准填充。

  • 相关阅读:
    Spring AOP实现 | 代理模式分析
    对象引用、可变性和垃圾回收
    K8s集群安装Devops
    OpenGL原理与实践——核心模式(四):摄像机变换理论与应用
    「C#」WPF学习笔记-基础类及继承关系
    【转载】分布式训练和集合通信
    ML-Net:通过深度学习彻底改变多标签分类
    设计模式---模板方法模式
    2022pycharm:虚拟环境的启用与删除
    用ChatGPT做一个Chrome扩展 | 京东云技术团队
  • 原文地址:https://blog.csdn.net/xiantianga6883/article/details/128001559