设为首页收藏本站

91ROOT

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: udp
查看: 2362|回复: 5

[PHP] AES解密及ZIP文件HASH验证 [复制链接]

Rank: 9Rank: 9Rank: 9

发表于 2010-2-1 18:13:48 |显示全部楼层
关于PHP的AES加解密 因为padding方式和JAVA的不同,所以很多程序员都遇到了问题,下面发一段已经通过的例子,希望对大家有所帮助
  1. <?php

  2. //---------------------------------------------------------------
  3. //        AES解密及ZIP文件HASH验证 PHP版本 V0.2
  4. //        (c) 2010 Smallthing
  5. //        website: http://www.91root.com/
  6. //        转载请勿删除版权谢谢大家 ---分享互联网---
  7. //---------------------------------------------------------------

  8. $crtptText = "WlhWV79jQHK1ZVH9O6K/aYIzcswYs7P3/L/qEJ6U51X+LltCdH6w5etsP0SFiqEkxlJryn3V82ODnGCG0eR0CLUK2g8uii6ede+M8v7UEjqnhXfsLHMFOxbrl8qP08KL254sNFy/TnmcYXyWpSUzbyXlbipNoE+HewEwnK9pr+WEVUIKgtNFJlAXTx5aY9ATvzTI2OwU/flveOTaxBjFXYbUXbnNxJN8XJyi44MRwphwyyCZ2b+2EJruJS8cG5Y2mLckcS/rdqB+XcALAf39zIVNsV5koWA/M4So3HYEt5z0A8e06H1HKrU4thwb2Cn6+N/I0GSPksaZ/k9emZKArH59xvnHWBuRKL7qG30MQphcngxZh1OvQ1Gc6zDow1AyI5ysdDMzTJVGgtqpfr98BOY1XPJD7XeUCxJ6PR7djcYSJ6JwZIqOV1pVY3+wiA7MT42CVOirDOrm9CvLDew8wtOzcj3QuQtypI7HvkI747oiMFj+pQq173qzI/Yciqs3";//从XML中读取到的被Base64后的密文

  9. $hexcrtptText =   bin2hex(base64_decode($crtptText));//将编码后的密文Base64解码后转换为十六进制码
  10. //echo "HEX CRYPTEXT:".$hexcrtptText."/n";显示密文的十六进制码,调试对照用

  11. function pkcs5_pad ($text, $blocksize)
  12. {
  13. $pad = $blocksize - (strlen($text) % $blocksize);
  14. return $text . str_repeat(chr($pad), $pad);
  15. }//pkcs5补码函数

  16. function pkcs5_unpad($text)
  17. {
  18. $pad = ord($text{strlen($text)-1});
  19. if ($pad > strlen($text)) return $text;
  20. if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return $text;
  21. return substr($text, 0, -1 * $pad);
  22. }//pkcs5截码函数

  23. //PKCS5补码说明:AES加密中,将数据每16位(bits)分为一块,在PHP中不足16位的,每差n位,剩余位会被补入n个null,而Java和.Net会被补入n个n,这两个函数是对Java做兼容处理,加密前补码,解密后截码

  24. function hex2bin($hexdata) {
  25.         $bindata="";
  26.         for ($i=0;$i<strlen($hexdata);$i+=2) {
  27.             $bindata.=chr(hexdec(substr($hexdata,$i,2)));
  28.         }
  29.         return $bindata;
  30.     }

  31. class CryptAES{                                                        //默认参数
  32.     private $cipher     = "rijndael-128";//加密算法
  33.     private $mode       = "cbc";//加密模式
  34.     private $secret_key = "1234567890123456";//企业临时密钥
  35.     private $iv         = "0102030405060708";//加密偏移量

  36.     function CryptAES($iv,$key){
  37.         $this->iv = $iv;
  38.         $this->secret_key = $key;
  39.     }

  40.     function encrypt($str){
  41.         $td = mcrypt_module_open($this->cipher, "", $this->mode, $this->iv);
  42.         mcrypt_generic_init($td, $this->secret_key, $this->iv);
  43.         $cyper_text = mcrypt_generic($td, $str);
  44.         $r = bin2hex($cyper_text);
  45.         mcrypt_generic_deinit($td);
  46.         mcrypt_module_close($td);
  47.         return $r;
  48.     }

  49.     function decrypt($str){
  50.         $td = mcrypt_module_open($this->cipher, "", $this->mode, $this->iv);
  51.         mcrypt_generic_init($td, $this->secret_key, $this->iv);
  52.         $decrypted_text = mdecrypt_generic($td, $this->hex2bin($str));
  53.         $r = $decrypted_text;
  54.         mcrypt_generic_deinit($td);
  55.         mcrypt_module_close($td);
  56.         return $r;
  57.     }

  58.     private function hex2bin($hexdata) {
  59.         $bindata="";
  60.         for ($i=0;$i<strlen($hexdata);$i+=2) {
  61.             $bindata.=chr(hexdec(substr($hexdata,$i,2)));
  62.         }
  63.         return $bindata;
  64.     }
  65. }

  66. $aes = new CryptAES("0102030405060708","1234567890123456");//新对象新iv+key


  67. $zipbin = $aes->decrypt($hexcrtptText);//对密文进行解密,得出内藏xml的zip格式二进制文件
  68. //echo "zipbin decrypted BIN:".$zipbin."\n";//调试使用
  69.                 $text=pkcs5_unpad($zipbin);//对解密后的明文进行截码操作,得到最终zipbin
  70. //                echo "s5 decrypted HEX:".bin2hex($s5)."\n";//显示截码后的zip文件hex码,调试参照使用
  71. $zipbinHash=md5($text);
  72. $beianInfohash_hex=bin2hex(base64_decode("NK/LKz3zT5xM2sy8PoU3hw=="));
  73. echo "zipbinmd5:".$zipbinHash."\r\n";
  74. echo "beianInfohash_hex:".$beianInfohash_hex;
  75. if ($zipbinHash == $beianInfohash_hex)
  76.                 {
  77.                         echo "\r\nOK ";
  78.         $file_name="text.zip";
  79.         $fp=fopen ($file_name,"w");
  80.         fwrite($fp,$text);
  81.         fclose($fp);//这里是例子程序,实际根据需要将$text变量写入文件存档或写入文件流进一步解压xml皆可
  82. }
  83. else echo "beianInfohash error";//后续处理函数

  84. ?>
复制代码

Rank: 9Rank: 9Rank: 9

发表于 2010-2-3 18:08:00 |显示全部楼层
前天晚上发上来的时候正在做其他文件的测试了 写完注释后所发出来的密文和beianHashInfo并不是一套 在此对调试不过的同学表示道歉 并修正一个错误
现在的应该是可以直接运行的版本了 版本号改为V0.2

使用道具 举报

Rank: 1

发表于 2010-3-10 16:52:35 |显示全部楼层

使用道具 举报

Rank: 1

发表于 2011-3-26 10:43:55 |显示全部楼层
不懂啊,能再问您一个问题吗?

使用道具 举报

Rank: 1

发表于 2011-3-26 10:45:34 |显示全部楼层
isp_querybeianstatus用到的randVal和pwdHash,是怎么来的?和备案系统里设置的数据加密密钥偏移量:数据加密密钥: 有什么关联呢?

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-4-10 23:41:05 |显示全部楼层
一个是随机数+字串 一个是MD5后进行base64

http://bbs.91root.com/thread-23-1-1.html
请参考这个

我想,我的前生也许是一滴水,今生来到人世间,或许,不知什么时候我会蒸发,消失了
悄悄的来,悄悄地走……

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

手机版|Archiver|91root技术区 ( 皖ICP备09028067号 )  

GMT+8, 2012-2-6 22:18 , Processed in 0.051392 second(s), 17 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部