ZIP格式

总体格式

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

1.分文件头信息

1109779-20170416214008587-85546943.jpg

0X 50 4b 03 04

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

14 00

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

00 09

表示加密

这里,如果是 00 00 就表示未加密。另外,关于Zip的伪加密,这里是以00 00 的形式出现。但是在解压的时候还是会有提示要输入密码,这跟后面的其他块有关。只要这里是 00 00 ,就一定是未加密的。

其他信息

1109779-20170416214020024-136857539.jpg

2.中心目录结构

0X 50 4b 01 02

中心文件头信息标志

其他信息

1109779-20170416214119024-1170193360.jpg

3.中心目录记录结束符

0X 50 4b 05 06

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

关于,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  
        结束循环  

转载于:https://www.cnblogs.com/ycll/p/6720178.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值