标准PHP的AES加密算法类

 更新时间:2023年05月03日 12:40:58   投稿:hebedich  
AES是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。

分享一个标准PHP的AES加密算法类,其中mcrypt_get_block_size('rijndael-128', 'ecb');,如果在不明白原理的情况下比较容易搞错,可以通过mcrypt_list_algorithms函数查看你需要的加密算法标识。

<?php
/**
 * AES128加解密类
 * @author dy
 *
 */
defined('InEjbuy') or exit('Access Invalid!');
class Aes{
    //密钥
    private $_secrect_key;
    public function __construct(){
        $this->_secrect_key = 'MYgGnQE2jDFADSFFDSEWsdD';
    }
    /**
     * 加密方法
     * @param string $str
     * @return string
     */
    public function encrypt($str){
        //AES, 128 ECB模式加密数据
        $screct_key = $this->_secrect_key;
        $screct_key = base64_decode($screct_key);
        $str = trim($str);
        $str = $this->addPKCS7Padding($str);
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB),MCRYPT_RAND);
        $encrypt_str =  mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_ECB, $iv);
        return base64_encode($encrypt_str);
    }
    /**
     * 解密方法
     * @param string $str
     * @return string
     */
    public function decrypt($str){
        //AES, 128 ECB模式加密数据
        $screct_key = $this->_secrect_key;
        $str = base64_decode($str);
        $screct_key = base64_decode($screct_key);
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB),MCRYPT_RAND);
        $encrypt_str =  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_ECB, $iv);
        $encrypt_str = trim($encrypt_str);
        $encrypt_str = $this->stripPKSC7Padding($encrypt_str);
        return $encrypt_str;
    }
    /**
     * 填充算法
     * @param string $source
     * @return string
     */
    function addPKCS7Padding($source){
        $source = trim($source);
        $block = mcrypt_get_block_size('rijndael-128', 'ecb');
        $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){
        $source = trim($source);
        $char = substr($source, -1);
        $num = ord($char);
        if($num==62)return $source;
        $source = substr($source,0,-$num);
        return $source;
    }
}

PHP AES算法的通用函数

 function aesEncrypt($data, $key, $iv) {
    $cipher = "aes-256-cbc";
    $padding = OPENSSL_PKCS1_PADDING;
    $encrypted = openssl_encrypt($data, $cipher, $key, $padding, $iv);
    return base64_encode($encrypted);
}
function aesDecrypt($data, $key, $iv) {
    $cipher = "aes-256-cbc";
    $padding = OPENSSL_PKCS1_PADDING;
    $decrypted = openssl_decrypt(base64_decode($data), $cipher, $key, $padding, $iv);
    return $decrypted;
}

该函数使用AES-256-CBC加密算法和PKCS1填充模式。它需要三个参数:要加密/解密的数据,密钥和初始化向量(IV)。在加密时,数据将被加密并返回Base64编码的字符串。在解密时,Base64编码的字符串将被解码并返回原始数据。

以上就是本文所述的全部内容了,希望对大家学习php的AES加密算法类有所帮助。

相关文章

  • PHP自带ZIP压缩、解压缩类ZipArchiv使用指南

    PHP自带ZIP压缩、解压缩类ZipArchiv使用指南

    这篇文章主要介绍了PHP自带ZIP压缩、解压缩类ZipArchiv使用指南,十分详细,需要的朋友可以参考下
    2015-03-03
  • PHP接口继承及接口多继承原理与实现方法详解

    PHP接口继承及接口多继承原理与实现方法详解

    这篇文章主要介绍了PHP接口继承及接口多继承原理与实现方法,简单描述了接口继承与多接口继承的概念、原理,并结合实例形式给出了php接口继承的具体实现与使用等操作技巧,需要的朋友可以参考下
    2017-10-10
  • php 数组二分法查找函数代码

    php 数组二分法查找函数代码

    search函数 其中$array为数组,$k为要找的值,$low为查找范围的最小键值,$high为查找范围的最大键值
    2010-02-02
  • PHP中的integer类型使用分析

    PHP中的integer类型使用分析

    integer 类型 就是 集合Z = {..., -2, -1, 0, 1, 2, ...}中的一个数字。
    2010-07-07
  • php数组合并array_merge()函数使用注意事项

    php数组合并array_merge()函数使用注意事项

    array_merge()函数在php中是对数组进行合并的,可以把多个数组合成一个数组,并且不改变原数组(www.111cn.net)的值了,但今天我在使用array_merge合并数组时碰到几个小细节上的问题,下面我举例子给各位朋友看看
    2014-06-06
  • PHP页面间参数传递的四种方法详解

    PHP页面间参数传递的四种方法详解

    本篇文章是对PHP页面间参数传递的四种方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP Laravel框架异步执行的实现详解

    PHP Laravel框架异步执行的实现详解

    Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力
    2022-07-07
  • 详解PHP解决守护进程Redis假死

    详解PHP解决守护进程Redis假死

    公司业务有一个常驻后台运行的守护进程。在这个守护进程当中使用了 Redis List 结构保存业务数据进行队列消费。结果运行过程中,有时候半个月,有时候几个月就会突然不再消费队列里面的数据。我们发现进行心中检测之后,程序的稳定性大大提高。
    2021-06-06
  • PHP简单实现解析xml为数组的方法

    PHP简单实现解析xml为数组的方法

    这篇文章主要介绍了PHP简单实现解析xml为数组的方法,涉及php文件读取、xml解析相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • 用PHP调用Oracle存储过程的方法

    用PHP调用Oracle存储过程的方法

    php程序访问数据库,完全可以使用存储过程,有人认为使用存储过程便于维护。不过仁者见仁,智者见智,在这个问题上,偶认为使用存储过程意味着必须要dba和开发人员更紧密配合,如果其中一方更变,则显然难以维护。
    2008-09-09

最新评论