免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10087 | 回复: 6
打印 上一主题 下一主题

检测zip文件是否加密 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-22 13:26 |只看该作者 |倒序浏览
对于用shell脚本检测zip文件是否加密这个问题已经困扰了好久,今天查阅了一些资料,发现了一些新思路,根据zip文件头结构里的定义,第8字节里如果最后一位为1则是加密的,否则为不加密的,于是做了个简单的实验验证了一下。
    分别生成两个压缩包,一个不加密的123.zip,一个加密的abc.zip,
$hexdump -n 8 123.zip
0000000 4b50 0403 0014 0000                    
0000008
$hexdump -n 8 abc.zip
0000000 4b50 0403 000a 0009                    
0000008

    hexdump是linux上一个查看16进制格式文件的工具,-n参数是需要显示的字节数,我们只显示前8个字节,这样可以得到最后一个字节数的16进制格式,可以看到,不加密的123.zip文件的第8字节为0,最后一位位0,不加密,加密的文件abc.zip第8字节为9,最后一位位1,是加密的。
不过这只是一个简单的实验,不知道是否正确,等待高人作答。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2009-12-22 13:29 |只看该作者
思路不错,顶一下

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2009-12-22 14:09 |只看该作者
man unzip 查查吧,估计对于加密的情况直接有特定的返回值

论坛徽章:
0
4 [报告]
发表于 2009-12-23 13:36 |只看该作者
man手册里好像没找到关于这方面的定义,不知道是不是因为我看的不够仔细
不过用其他的zip压缩包也都试了,好像前8字节和我实验的结果是完全一样的
不加密的全部为4b50 0403 0014 0000,加密的全部为4b50 0403 000a 0009

论坛徽章:
0
5 [报告]
发表于 2009-12-23 13:37 |只看该作者
ZIP文件的总体格式     
          分文件头信息+文件压缩数据     
          中心目录+中心目录记录结束符     
        
          1.分文件头信息:     
              字节数   描述     
              4             分文件头信息标志(0x04034b50)     
              2             解压缩所需版本     
              2             通用比特标志位(置比特0位=加密;置比特1位=使用压     
  缩方式6,并使用8k变化目录,否则使用4k变化目录;置比特2位=使用压     
  缩方式6,并使用3个ShannonFano树对变化目录输出编码,否则使用2个     
  ShannonFano树对变化目录输出编码,其它比特位未用)
     
              2             压缩方式(0=不压缩,1=缩小,2=以压缩因素1缩小,3=以     
  压缩因素2缩小,4=以压缩因素3缩小,5=以压缩因素4缩小,6=自展)     
              2             文件最后修改时间     
              2             文件最后修改日期     
              4             32位校验码     
              4             压缩文件大小     
              4             未压缩文件大小     
              2             文件名长     
              2             扩展段长     
              ?             文件名(不定长)     
              ?             扩展段(不定长)     
        
          2.中心目录结构     
              文件头信息...中心目录记录结束符     
              文件头:     
              字节数     描述     
              4                 中心文件头信息标志(0x02014b50)     
              2                 主机操作系统(高位字节表示主机操作系统,低位字     
  节表示ZIP压缩软件版本号,其值除以10表示主版本号,其值模10表示     
  次版本号。0=MS-DOS,OS/2   FAT文件系统,1=Ami   ga,2=VMS,3=Unix及     
  变种,4=VM/CMS,5=AtariST,6=OS/2   HPFS,7=Macintosh,8=Z-System,9     
  =C   P/M,10-255未用)     
              2                 解压缩所需版本     
              2                 通用比特标志     
              2                 压缩方式     
              2                 文件最后修改时间(用标准的MS-DOS时间日   期格式     
  编码)     
              2                 文件最后修改日期     
              4                 32位校验码(使用David   Schwaderer的CRC-32算法产     
  生)     
              4                 压缩文件大小     
              4                 未压缩文件大小     
              2                 文件名长     
              2                 扩展段长     
              2                 文件注释长(分别为文件名长,扩展段,注释   段,小于     
  64K)     
              2                 磁盘起始号(本文件在磁盘中的起始号)     
              2                 内部文件属性(最低位若置1,表示为ASC文本,否则为     
  二进制数据,其它位未用)     
              4                 外部文件属性(依赖于主机操作系统)     
              4                 分文件头相对位移     
              ?                 文件名(不定长)     
              ?                 扩展段(不定长,用于未来扩展,低版本为0长)     
              ?                 文件注释(不定长)     
        
          3.中心目录记录结束符     
              字节数     描述     
              4                 中心目录标记结束符(0x06054b50)     
              2                 磁盘号(其中包括中心目录结束记录)     
              2                 磁盘中心目录起始号     
              2                 磁盘中心目录入口总数     
              2                 中心目录入口总数(ZIP文件中的文件总数)     
              2                 整个中心目录大小     
              4                 关于起始磁盘号的中心目录初始偏移     
              2                 ZIP文件注释长度     
              ?                 ZIP文件注释(不定长)     
        
          加密方法     
          PKZIP中使用的加密方法由Roger   Schlafly提供。ZIP文件在解压     
  缩前必须先解密。每个加密文件具有一个12字节的加密文件头扩展信     
  息,存储于数据区的起始位置,加密前先设置一个起始值,然后被三个3     
  2位的密钥加密。密钥被使用者提供的口令初始化。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>>,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))>>&0xff     
          end   decrypt_byte     
          该步结束后,缓冲区中最后的二个字节buffer(10)和buffer(11)     
  将成为加密文件校验码的二个最高位(按低至高顺序存放)。对ZIP加     
  密文件进行解压缩前,PKUNZIP软件将使用者提供的口令按上述二个步     
  骤进行处理,得到的结果与校验码的二个高位字节进行比较,只有当提     
  供了正确的口令时,结果一致,才能进行后续的解压缩过程,否则,PKZI     
  P报告错误信息,程序自动结束。     
        
          3.读取压缩的数据流并以加密密钥对其进行加密。     
          压缩数据流按下述过程加密:     
          循环   直至数据流结束     
          C=数据流的一个字节     
          temp=C^decrypt_byte()     
          update_keys(temp)     
          输出temp     
          结束循环

[ 本帖最后由 和兴和红棍 于 2009-12-23 13:38 编辑 ]

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
6 [报告]
发表于 2009-12-23 14:00 |只看该作者

回复 #5 和兴和红棍 的帖子

可能以后用到,收藏下

论坛徽章:
0
7 [报告]
发表于 2009-12-25 12:27 |只看该作者
今天又有了新的思路,在unzip的参数里可以加一个空密码去测试,如果是没有加密的文件,执行结果返回0,如果是有密码的文件,会报错,执行结果返回值肯定不是0,根据我的测试结果,返回值是82,所以可以用这条命令

$unzip -t -p '' -q abc.zip
$echo $?

用同样的方法,也可以检测rar文件是否加密,不过需要先安装rar,因为rar是收费软件,所以linux上默认都是不安装的,只能先去rar的官方下载一个linux版本,解压后把rar,unrar两个文件cp到/usr/bin目录下,然后执行如下命令

$unrar T -p- abc.rar
$echo $?

只要看返回值是否为0就可以了,如果为0就是不加密的文件,如果不为0当然就是加密的文件了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP