总体格式
- 分文件头+文件压缩数据
- 中心目录+中心目录记录结束符
1.分文件头信息
0X 50 4b 03 04
分文件头信息标志,一般是zip文件的开头,可以通过这个判断文件格式
14 00
解压缩所需版本,一般固定
00 09
表示加密
这里,如果是 00 00 就表示未加密。另外,关于Zip的伪加密,这里是以00 00 的形式出现。但是在解压的时候还是会有提示要输入密码,这跟后面的其他块有关。只要这里是 00 00 ,就一定是未加密的。
其他信息
2.中心目录结构
0X 50 4b 01 02
中心文件头信息标志
其他信息
3.中心目录记录结束符
0X 50 4b 05 06
中心目录标记结束符,也就是整个zip结束的标志,不过后面还有一些其他数据块。
关于,zip加密算法
1.加密方法
- PKZIP中使用的加密方法由Roger Schlafly提供。ZIP文件在解压
缩前必须先解密。 - 每个加密文件具有一个12字节的加密文件头扩展信息,存储于数据区的起始位置,加密前先设置一个起始值,然后被三个32位的密钥加密。密钥被使用者提供的口令初始化。
- 12个字节加密之后,由PKZIP的伪随机数产生方法,结合PKZIP中使用CRC-32算法对密钥进行更新。
1.用口令对三个32位密钥初始化。
K(0)=305419896,K(1)=591751049,K(2)=878082192
循环 for i=0 to length(password)-1
调用更新密钥函数 update_keys(password(i))
结束循环(循环口令长度次)
其中更新密钥函数为:
update_keys(char):
Key(0)=crc32(key(0),char)
Key(1)=Key(1)+(Key(0)& 000000ffH)
Key(1)=Key(1)*134775813+1
Key(2)=crc32(Key(2),Key(1)〉〉24)
end update_keys
CRC32函数中,给定一个4字节的CRC值和一个字符,返回一个由CRC
-32算法更新的CRC。具体为:
crc32(c,b)=crc32tab[(c^b)&0xff]^(c> >8),crc32tab[256]的值
为固定的256个4字节数。
2.读取并加密12字节的加密头,再次对密钥进行初始化。
将12个字节的加密头读入缓冲区buffer(0)至buffer(11),循环fo
r i=0 to 11
C=buffer(i)^decrypt_byte()
update_keys(C)
buffer(i)=C
结束循环(循环12次)
其中的decrypt_byte()函数为:
unsigned char decrypt_byte()
local unsigned short temp
temp=Key(2)¦2
decrypt_byte=((temp*(temp^1))> > 8)&0xff
end decrypt_byte
该步结束后,缓冲区中最后的二个字节buffer(10)和buffer(11)
将成为加密文件校验码的二个最高位(按低至高顺序存放)。
对ZIP加密文件进行解压缩前,PKUNZIP软件将使用者提供的口令按上述二个步骤进行处理,得到的结果与校验码的二个高位字节进行比较,只有当提
供了正确的口令时,结果一致,才能进行后续的解压缩过程,否则,PKZI
P报告错误信息,程序自动结束。
3.读取压缩的数据流并以加密密钥对其进行加密。
压缩数据流按下述过程加密:
循环 直至数据流结束
C=数据流的一个字节
temp=C^decrypt_byte()
update_keys(temp)
输出temp
结束循环