AES/CBC/PKCS5Padding加解密
来源:互联网 发布:手机壁纸diy软件 编辑:程序博客网 时间:2024/05/18 01:58
aes/cbc/pkcs5padding/128加解密示例:
<?phpclass AesEncrypt{ //自定义key protected $key; //cipher算法类型 protected $cipher = 'rijndael-128'; //mode模型 protected $mode = 'cbc'; public function __construct($key){ $this->key = $key; } //aes加密 public function aesEncrypt($data){ //随机生成16位iv,初始向量 $iv = self::aesRandom(16,'1234567890abcdefghijklmnopqrstuvwxyz'); //pkcs5padding //获取加密算法分组大小 $block = mcrypt_get_block_size($this->cipher, $this->mode); //方式一 计算补码长度,chr-返回相对应于 ascii 所指定的单个字符 //$pad = chr($block - (strlen($data)%$block)); //str_pad-使用另一个字符串填充字符串为指定长度 //$pad = str_pad($data, ceil(strlen($data)/16.0)*16, $pad); //方式二 获取补码长度 $pad = $block-(strlen($data)%$block); str_repeat-重复一个字符串chr($pad),$pad次 $pad = $data.str_repeat(chr($pad), $pad); //mcrypt_module_open - 打开算法和模式对应的模块 $td = mcrypt_module_open($this->cipher, '', $this->mode, ''); //mcrypt_generic_init-初始化加密所需的缓冲区 mcrypt_generic_init($td , $this->key , $iv); //mcrypt_generic- 加密数据,使用前必须调用mcrypt_generic_init $encrypt = mcrypt_generic($td, $pad); //mcrypt_generic_deinit — 对加密模块进行清理工作,它会清理缓冲区,但是并不关闭模块 mcrypt_generic_deinit($td); //mcrypt_module_close — 关闭加密模块 mcrypt_module_close($td); //iv拼密串之后base64 return base64_encode($iv.$encrypt); } //aes解密 public function aesDecrypt($data){ $data = base64_decode($data) ;//base64 //前16位为iv $iv = substr($data, 0, 16); //16位后未密串 $data = substr($data, 16); //mcrypt_module_open - 打开算法和模式对应的模块 $td = mcrypt_module_open($this->cipher, '', $this->mode, ''); //mcrypt_generic_init-初始化加密所需的缓冲区 mcrypt_generic_init($td , $this->key , $iv); //mdecrypt_generic — 解密数据,使用前必须调用mcrypt_generic_init $decrypt = mdecrypt_generic($td, $data); //mcrypt_generic_deinit — 对加密模块进行清理工作 mcrypt_generic_deinit($td); //mcrypt_module_close — 关闭加密模块 mcrypt_module_close($td); //Remove the padding //ord-返回字符的 ASCII 码值 $pad = ord($decrypt[($len = strlen($decrypt))-1]); //返回补码开始索引位置 $beforePad = strlen($decrypt) - $pad; //判断是否补码过 $decrypt = substr($decrypt, $beforePad) == str_repeat(substr($decrypt, -1), $pad) ? substr($decrypt, 0, $len - $pad) : $decrypt; return $decrypt; } //随机生成16位iv public function aesRandom($length, $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789') { $hash = ''; $max = strlen($chars) - 1; for($i = 0; $i < $length; $i++) { $hash .= $chars[mt_rand(0, $max)]; } return $hash; } //修改cipher public function setCipher($cipher){ $this->cipher = $cipher; } //修改mode public function setMode($mode){ $this->mode = $mode; }}//初始化类$aes = new aesEncrypt('I4fe6xmsndfrGK4g');$str = 'xiaoming';//加密$res = $aes->aesEncrypt($str);echo $res."<br/>";//解密$res2 = $aes->aesDecrypt($res);echo $res2."<br/>";$resstr = 'rTnAY7a6vnHkUqfICRxgtiXBYXcP2f+A+zxy4ONsg3w=';$res3 = $aes->aesDecrypt($resstr);echo $res3."<br/>";
示例结果:
aesEncrypt: MWY5bzBvOXdidWUxMnU4N/f8ANDZUw3cSza+QCnIquI=aesDecrypt: xiaomingaesDecrypt: xiaoming
url后带加密参数获取问题
示例:
http://test.local?token=rTnAY7a6vnHkUqfICRxgtiXBYXcP2f+A+zxy4ONsg3w=
获取以上url后所带参数token
浏览器会将一些特殊字符自动转码,所以获取时需注意转换
1)urldecode
urldecode后将+号转换成空格,需要替换
$token = Input::get('token');$token = urldecode($token);echo $token.'<br>';$token = str_replace(' ','+',$token);echo $token;
示例结果:
rTnAY7a6vnHkUqfICRxgtiXBYXcP2f A zxy4ONsg3w=rTnAY7a6vnHkUqfICRxgtiXBYXcP2f+A+zxy4ONsg3w=
2)rawurldecode
$token = Input::get('token');echo rawurldecode($str);
示例结果:
rTnAY7a6vnHkUqfICRxgtiXBYXcP2f+A+zxy4ONsg3w=
2 0
- AES/CBC/PKCS5Padding加解密
- AES/CBC/PKCS5Padding 对称算法加解密
- java/php对应的AES/CBC/PKCS5Padding模式 加密解密
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现【多种语言AES/CBC/PKCS5Padding通用加解密数据】
- C# AES-256-CBC 加解密
- AES CBC和CTR加解密实例
- AES CBC和CTR加解密实例
- Java利用 AES/ECB/PKCS5Padding 算法加解密
- Java利用 AES/ECB/PKCS5Padding 算法加解密
- java实现基于PKCS5Padding填充方式的AES加解密
- PHP和Java AES 128 ECB 加解密(PKCS5Padding)
- php AES/CBC/PKCS5Padding 与java对接
- AES-CBC-PKCS5Padding加密算法Java实现
- AES-CBC-PKCS5Padding加密算法Java实现
- java加密之AES/CBC/PKCS5Padding
- Android 使用AES/CBC/PKCS7Padding 加解密字符串
- Java 使用AES/CBC/PKCS7Padding 加解密字符串
- C++ 和 java 使用 AES CBC 128 加解密
- 华中科技大学 2010 奇偶校验
- I2C通信 读写数据过程
- Java、JFrame制作录制GIF小工具
- initialize方法和init区别详解
- BZOJ2818: Gcd
- AES/CBC/PKCS5Padding加解密
- interactivePopGestureRecognizer
- NodeJS入门(一)- 基本文件路由实现
- open-GOP
- 挑战练习题2.3动态规划 poj1742 Coins 多重背包
- JavaFX TableCell经验分享
- Problem--546A--Codeforces--Soldier and Bananas
- 关于IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]的解决
- Cookie 和 Session 的使用简记