- 注册时间
- 2010-1-5
- 最后登录
- 2012-1-10
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 100
- 精华
- 0
- UID
- 1
  
|
关于PHP的AES加解密 因为padding方式和JAVA的不同,所以很多程序员都遇到了问题,下面发一段已经通过的例子,希望对大家有所帮助- <?php
- //---------------------------------------------------------------
- // AES解密及ZIP文件HASH验证 PHP版本 V0.2
- // (c) 2010 Smallthing
- // website: http://www.91root.com/
- // 转载请勿删除版权谢谢大家 ---分享互联网---
- //---------------------------------------------------------------
- $crtptText = "WlhWV79jQHK1ZVH9O6K/aYIzcswYs7P3/L/qEJ6U51X+LltCdH6w5etsP0SFiqEkxlJryn3V82ODnGCG0eR0CLUK2g8uii6ede+M8v7UEjqnhXfsLHMFOxbrl8qP08KL254sNFy/TnmcYXyWpSUzbyXlbipNoE+HewEwnK9pr+WEVUIKgtNFJlAXTx5aY9ATvzTI2OwU/flveOTaxBjFXYbUXbnNxJN8XJyi44MRwphwyyCZ2b+2EJruJS8cG5Y2mLckcS/rdqB+XcALAf39zIVNsV5koWA/M4So3HYEt5z0A8e06H1HKrU4thwb2Cn6+N/I0GSPksaZ/k9emZKArH59xvnHWBuRKL7qG30MQphcngxZh1OvQ1Gc6zDow1AyI5ysdDMzTJVGgtqpfr98BOY1XPJD7XeUCxJ6PR7djcYSJ6JwZIqOV1pVY3+wiA7MT42CVOirDOrm9CvLDew8wtOzcj3QuQtypI7HvkI747oiMFj+pQq173qzI/Yciqs3";//从XML中读取到的被Base64后的密文
- $hexcrtptText = bin2hex(base64_decode($crtptText));//将编码后的密文Base64解码后转换为十六进制码
- //echo "HEX CRYPTEXT:".$hexcrtptText."/n";显示密文的十六进制码,调试对照用
- function pkcs5_pad ($text, $blocksize)
- {
- $pad = $blocksize - (strlen($text) % $blocksize);
- return $text . str_repeat(chr($pad), $pad);
- }//pkcs5补码函数
- function pkcs5_unpad($text)
- {
- $pad = ord($text{strlen($text)-1});
- if ($pad > strlen($text)) return $text;
- if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return $text;
- return substr($text, 0, -1 * $pad);
- }//pkcs5截码函数
- //PKCS5补码说明:AES加密中,将数据每16位(bits)分为一块,在PHP中不足16位的,每差n位,剩余位会被补入n个null,而Java和.Net会被补入n个n,这两个函数是对Java做兼容处理,加密前补码,解密后截码
- function hex2bin($hexdata) {
- $bindata="";
- for ($i=0;$i<strlen($hexdata);$i+=2) {
- $bindata.=chr(hexdec(substr($hexdata,$i,2)));
- }
- return $bindata;
- }
- class CryptAES{ //默认参数
- private $cipher = "rijndael-128";//加密算法
- private $mode = "cbc";//加密模式
- private $secret_key = "1234567890123456";//企业临时密钥
- private $iv = "0102030405060708";//加密偏移量
-
- function CryptAES($iv,$key){
- $this->iv = $iv;
- $this->secret_key = $key;
- }
-
- function encrypt($str){
- $td = mcrypt_module_open($this->cipher, "", $this->mode, $this->iv);
- mcrypt_generic_init($td, $this->secret_key, $this->iv);
- $cyper_text = mcrypt_generic($td, $str);
- $r = bin2hex($cyper_text);
- mcrypt_generic_deinit($td);
- mcrypt_module_close($td);
- return $r;
- }
-
- function decrypt($str){
- $td = mcrypt_module_open($this->cipher, "", $this->mode, $this->iv);
- mcrypt_generic_init($td, $this->secret_key, $this->iv);
- $decrypted_text = mdecrypt_generic($td, $this->hex2bin($str));
- $r = $decrypted_text;
- mcrypt_generic_deinit($td);
- mcrypt_module_close($td);
- return $r;
- }
-
- private function hex2bin($hexdata) {
- $bindata="";
- for ($i=0;$i<strlen($hexdata);$i+=2) {
- $bindata.=chr(hexdec(substr($hexdata,$i,2)));
- }
- return $bindata;
- }
- }
-
- $aes = new CryptAES("0102030405060708","1234567890123456");//新对象新iv+key
-
- $zipbin = $aes->decrypt($hexcrtptText);//对密文进行解密,得出内藏xml的zip格式二进制文件
- //echo "zipbin decrypted BIN:".$zipbin."\n";//调试使用
- $text=pkcs5_unpad($zipbin);//对解密后的明文进行截码操作,得到最终zipbin
- // echo "s5 decrypted HEX:".bin2hex($s5)."\n";//显示截码后的zip文件hex码,调试参照使用
- $zipbinHash=md5($text);
- $beianInfohash_hex=bin2hex(base64_decode("NK/LKz3zT5xM2sy8PoU3hw=="));
- echo "zipbinmd5:".$zipbinHash."\r\n";
- echo "beianInfohash_hex:".$beianInfohash_hex;
- if ($zipbinHash == $beianInfohash_hex)
- {
- echo "\r\nOK ";
- $file_name="text.zip";
- $fp=fopen ($file_name,"w");
- fwrite($fp,$text);
- fclose($fp);//这里是例子程序,实际根据需要将$text变量写入文件存档或写入文件流进一步解压xml皆可
- }
- else echo "beianInfohash error";//后续处理函数
- ?>
复制代码 |
|