PHP的AES加密类

算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度
AES/CBC/NoPadding 16 不支持
AES/CBC/PKCS5Padding 32 16
AES/CBC/ISO10126Padding 32 16
AES/CFB/NoPadding 16 原始数据长度
AES/CFB/PKCS5Padding 32 16
AES/CFB/ISO10126Padding 32 16
AES/ECB/NoPadding 16 不支持
AES/ECB/PKCS5Padding 32 16
AES/ECB/ISO10126Padding 32 16
AES/OFB/NoPadding 16 原始数据长度
AES/OFB/PKCS5Padding 32 16
AES/OFB/ISO10126Padding 32 16
AES/PCBC/NoPadding 16 不支持
AES/PCBC/PKCS5Padding 32 16
AES/PCBC/ISO10126Padding 32 16
下面就是在PHP中使用AES对数据加密
AES-CBC 加密方案

demo1

<?php
namespace app\common\lib;

/**
 * aes 加密 解密类库
 * @by singwa
 * Class Aes
 * @package app\common\lib
 */
class Aes {

    private $key = null;

    /**
     *
     * @param $key         密钥
     * @return String
     */
    public function __construct() {
        $this->key = 'testkeyabcdef123';  //key长度严格要求
    }

    /**
     * 加密
     * @param String input 加密的字符串
     * @param String key   解密的key
     * @return HexString
     */
    public function encrypt($input = '') {
        //AES, 128 ECB模式加密数据
        $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $input = $this->pkcs5_pad($input, $size);
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $this->key, $iv);

        $data = mcrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        $data = base64_encode($data);

        return $data;

    }
    /**
     * 填充方式 pkcs5
     * @param String text          原始字符串
     * @param String blocksize   加密长度
     * @return String
     */
    private function pkcs5_pad($text, $blocksize) {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }

    /**
     * 解密
     * @param String input 解密的字符串
     * @param String key   解密的key
     * @return String
     */
    public function decrypt($sStr) {
        //AES, 128 ECB模式加密数据
        $decrypted= mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$this->key,base64_decode($sStr), MCRYPT_MODE_ECB);
        $dec_s = strlen($decrypted);
        $padding = ord($decrypted[$dec_s-1]);
        $decrypted = substr($decrypted, 0, -$padding);

        return $decrypted;
    }

}

$obj = new Aes ();


$str = "?name=test&age=20&height=178";
echo $obj->encrypt($str);  //HpMdCda98M2oNBjVEdkoNygv+IMFl8uuWOJcpi6fo9w=
$str2 = 'xY+bQio6wRw6lxWZeiahw9YOfjbbHI23Pj0XLBn21y4=';
echo '<br>';
echo $obj->decrypt($str2);
xY+bQio6wRw6lxWZeiahw9YOfjbbHI23Pj0XLBn21y4=  //结果
?name=test&age=20&height=178            //结果

切记,如果加密的key不是按照要求的位数会报错

Warning: mcrypt_decrypt(): Key of size 48 not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported in

附加

<?php

/**
 * Created by PhpStorm.
 */

namespace App\Utils;

class Encrypt
{
    const ENCRYPTION_KEY = '8HyAIKULrvJWDMQt0W0D';

    public static function encrypt($carId)
    {
        $id = base_convert($carId, 10, 36);
        $data = mcrypt_encrypt(MCRYPT_BLOWFISH, md5(self::ENCRYPTION_KEY, true), $id, 'ecb');
        return bin2hex($data);
    }

    public static function decrypt($carIdEncrypted)
    {
        $binary = pack('H*', $carIdEncrypted);
        $data = mcrypt_decrypt(MCRYPT_BLOWFISH, md5(self::ENCRYPTION_KEY, true), $binary, 'ecb');
        return base_convert($data, 36, 10);
    }
}

 

 

demo2

function encrypt($string,$operation,$key=''){ 
    $key=md5($key); 
    $key_length=strlen($key); 
      $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; 
    $string_length=strlen($string); 
    $rndkey=$box=array(); 
    $result=''; 
    for($i=0;$i<=255;$i++){ 
           $rndkey[$i]=ord($key[$i%$key_length]); 
        $box[$i]=$i; 
    } 
    for($j=$i=0;$i<256;$i++){ 
        $j=($j+$box[$i]+$rndkey[$i])%256; 
        $tmp=$box[$i]; 
        $box[$i]=$box[$j]; 
        $box[$j]=$tmp; 
    } 
    for($a=$j=$i=0;$i<$string_length;$i++){ 
        $a=($a+1)%256; 
        $j=($j+$box[$a])%256; 
        $tmp=$box[$a]; 
        $box[$a]=$box[$j]; 
        $box[$j]=$tmp; 
        $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256])); 
    } 
    if($operation=='D'){ 
        if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){ 
            return substr($result,8); 
        }else{ 
            return''; 
        } 
    }else{ 
        return str_replace('=','',base64_encode($result)); 
    } 
}
'E' 是代表加密  ,  'D' 是代表解密
$key = 'www.baidu.com';
$str = 'QQ123456=>加密文字测试';
$en = encrypt($str, 'E',$key); 
echo $en;
echo '<br>';
echo encrypt($en, 'D',$key);

输出

加密后:/Z9n9aZCqNM0nY0HDMdEV8O1PQLfRfrgUVXYASbguk7gI0WMU4sw
解密后:QQ123456=>加密文字测试

 

posted @ 2018-01-05 19:43  温柔的风  阅读(2034)  评论(0编辑  收藏  举报