关于 AES 加密

AES 简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥。

  • 对称加密
    加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。秘钥容易泄露。
  • 非对称加密
    加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。

注意:
PHP7.2删除了Mcrypt扩展,这里使用OpenSSL扩展。

<?php 

/*
* AES 算法    
*/

class Aes {

    private $hex_iv = '00000000000000000000000000000000'; 

    private $key = '397e2eb61307109f6e68006ebcb62f98';

    function __construct($key) {
        $this->key = $key;
        $this->key = hash('sha256', $this->key, true);
    }
    /*
    * 字符串加密 不写入文件 
    */
    public function encrypt($input)
    {
        $data = openssl_encrypt($input, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
        $data = base64_encode($data);
        return $data;
    }

    /*
    * aes 给PHP文件加密
    * 写入设置文件
    */
    public function filecrypt($filename)
    {
        $type=strtolower(substr(strrchr($filename,'.'),1));
            if ('php' == $type && is_file($filename) && is_writable($filename)) {  
                 $contents = file_get_contents($filename);
                 // echo $contents;exit;  
                 $contents = php_strip_whitespace($filename);
                 // echo $contents;exit;
                 // $headerPos = strpos($contents,'<?php');
                 // echo $headerPos;exit;

                 // $contents = substr($contents, $headerPos + 5, $footerPos - $headerPos);
                 // echo $contents;exit;
                 $data = openssl_encrypt($contents, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
                 // echo $data;exit;
                 $data = base64_encode($data);
                 // echo $data;exit;
                 return file_put_contents($filename, $data);  
            }  
                 return false;  
    }
    /*
    * 字符串解密
    */
    public function decrypt($input)
    {
        $decrypted = openssl_decrypt(base64_decode($input), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
        return $decrypted;
    }

    /*
      For PKCS7 padding
     */

    private function addpadding($string, $blocksize = 16) {

        $len = strlen($string);

        $pad = $blocksize - ($len % $blocksize);

        $string .= str_repeat(chr($pad), $pad);

        return $string;

    }

    private function strippadding($string) {

        $slast = ord(substr($string, -1));

        $slastc = chr($slast);

        $pcheck = substr($string, -$slast);

        if (preg_match("/$slastc{" . $slast . "}/", $string)) {

            $string = substr($string, 0, strlen($string) - $slast);

            return $string;

        } else {

            return false;

        }

    }

    function hexToStr($hex)
    {

        $string='';

        for ($i=0; $i < strlen($hex)-1; $i+=2)

        {

            $string .= chr(hexdec($hex[$i].$hex[$i+1]));

        }

        return $string;
    }

}
$key = '397e2eb61307109f6e68006ebcb62f98';
$aes = new Aes($key);
$filename = __DIR__.'\exchange.php';
// $filename = 'Y6RCuF6ETPC5J57hfhxovg==';
// 加密
$string = $aes->filecrypt($filename);
// echo $string;
echo "OK,加密完成!" ;

二、简单函数加密PHP文件

<?php  

 function encode_file_contents($filename) {  
     $type=strtolower(substr(strrchr($filename,'.'),1));  
     if ('php' == $type && is_file($filename) && is_writable($filename)) { // 如果是PHP文件 并且可写 则进行压缩编码  
         $contents = file_get_contents($filename); // 判断文件是否已经被编码处理  
         $contents = php_strip_whitespace($filename);   

         // 去除PHP头部和尾部标识  
         $headerPos = strpos($contents,'<?php');  
         $footerPos = strrpos($contents,'?>');  
         $contents = substr($contents, $headerPos + 5, $footerPos - $headerPos);  
         $encode = base64_encode(gzdeflate($contents)); // 开始编码  
         $encode = '<?php'."\n eval(gzinflate(base64_decode("."'".$encode."'".")));\n\n?>";   

         return file_put_contents($filename, $encode);  
     }  
     return false;  
 }   

 //调用函数
 // echo __DIR__.'\server.php';   
 $filename = __DIR__.'\server.php';  
 encode_file_contents($filename);  
 echo "OK,加密完成!" ;
本作品采用《CC 协议》,转载必须注明作者和本文链接
aspirezh @
AspireHe
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2

建议使用 safe base64

5年前 评论
AspireHe

@lovecn 还有一个加密的php扩展 https://github.com/liexusong/php-beast

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
PHP @ 自由职业者
文章
1
粉丝
0
喜欢
6
收藏
6
排名:816
访问:8277
私信
所有博文
社区赞助商