总体格式

  • 分文件头+文件压缩数据
  • 中心目录+中心目录记录结束符

1.分文件头信息

ZIP格式-LMLPHP

0X 50 4b 03 04

分文件头信息标志,一般是zip文件的开头,可以通过这个判断文件格式

14 00

解压缩所需版本,一般固定

00 09

表示加密

其他信息

ZIP格式-LMLPHP

2.中心目录结构

0X 50 4b 01 02

中心文件头信息标志

其他信息

ZIP格式-LMLPHP

3.中心目录记录结束符

0X 50 4b 05 06

中心目录标记结束符,也就是整个zip结束的标志,不过后面还有一些其他数据块。

ZIP格式-LMLPHP

关于,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
3.读取压缩的数据流并以加密密钥对其进行加密。
压缩数据流按下述过程加密:
循环 直至数据流结束
C=数据流的一个字节
temp=C^decrypt_byte()
update_keys(temp)
输出temp
结束循环
05-06 15:15