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 加密方案

<?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

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/17137.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论