在EncryptZip的开发中, 前端Flex要能够对加密的zip的文件进行解密, 当时网上没有这个功能的现有的代码. 由于我使用的是纯AS代码, 经过比较几个网上现有的zip文件压缩的开源代码, 我采用了nochump, 并尝试在此基础上进行扩展.
zip的开发需要了解zip文件的压缩格式, 每个数据标志位的意义, 好在nochump的代码给出了详细的注释,在此对David Chang (dchang@nochump.com)表示由衷的感谢! 通过结合zip结构文档和nochump源代码,我一边调试,一边注释,这让我快速掌握zip的格式省了不少的时间.
为了验证我对了解zip文件格式是否正确, 用AS编写了一个的zip解压格式测试类, 代码如下:
在此时我用ActionScript3 做zip的加密解密算法验证, 发现zip解密文件时总不能正确解密, 默认解密密码为"123456" (此时后台Java没有实现zip的加密/解密功能,只负责将加密的文件传递给Flex, Flex 尝试解密), 经过跟踪调试发现问题出在_Keys[1], _Keys[1]乘以0x08088405后得到的值和计算器得到的值不一致, 即AS3出现 两个大数相乘得到的值不正确.
_Keys[0] = uint(CRC32.update(int(_Keys[0]), byteValue));
_Keys[1] = _Keys[1] + (_Keys[0] & 0xff);
_Keys[1] = _Keys[1] * 0x08088405; //the value of _Keys[1] afte it mutiplys by 0x08088405 is not correct.
_Keys[2] = uint(CRC32.update(int(_Keys[2]), (_Keys[1] >> 24) & 0xff));
这应该是Flex Sdks或Flash Player 造成的, 我当时的用到的版本Flex Sdks3.3, Flash Player 10.0. 不知道现在这个问题有没有解决.
两个大数相乘得到的值不正确这个问题无法逾越, 当时使EncryptZip的开发陷入的停滞. 好在此时已经对zip文件的格式很了解,也知道了zip加密/解密的相关算法, 因此我暂时停止了前端AS开发, 转向了对后台Java对zip加密/解密的开发, 开发进行的很顺利. (未完, 请阅读AS zip加密解密算法二)
(转贴请注明出处)
Author:David
Mail:xiang.okay@gmail.com