• ZIP格式


    总体格式

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

    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  
            结束循环  
    
    
  • 相关阅读:
    Bootstrap3.0学习第八轮
    内存管理相关的信息
    SVN merge
    Asp.Net MVC 3
    formValidator
    jquery 分页控件2
    从零开始学C++之STL(四):算法简介、7种算法分类
    (Java实现) 过河卒
    (Java实现) N皇后问题
    (Java实现) N皇后问题
  • 原文地址:https://www.cnblogs.com/ycll/p/6720178.html
Copyright © 2020-2023  润新知