前一篇文章介绍了如何用python自动解压缩加密的zip文件,

但是有一个问题,在服务器端脚本在解加密zip文件之前,需要检测其是否是加密文件,若是,则询问密码,结合密码解压缩;如果不是,则则直接解压缩。本文的灵感取自一篇文章《Linux zip 加密压缩》

所有加密的zip文件头8个字符好像都是这个样子的

0000000 4b50 0403 0014 0009

0000008

具体为什么会是这个格式,就不得而知了,需要以后做详细的研究。

还有另一个方法,就是通过python的 open() read()方法读取前十个字节,显示是十六进制数。经过测试,好像所有的zip文件前十个字节都是相同的,但是加密和未加密的文件则不同:

加密zip文件:'PK\x03\x04\x14\x00\t\x00\x08\x00'

未加密zip文件:'PK\x03\x04\x14\x00\x00\x00\x08\x00'

其中前四个字节‘PK\x03\x04' 是文件头标记。往后两个字节 ‘\x14\x00' 是解压文件所需的pkware的版本,再后来两个字节 '\x00\x00' 或者 '\t\x00' 是全局方式位标记,最后两个字节 '\x08\x00' 是压缩方式。

这里全局方式位置标记由于是否加密而有所不同,所以只需要比较这两个十六进制数字是否相等即可。

第二种方法还稍微快一些。

顺便说一下,博客园的文件上传系统只能上传zip文件,但是检测模块只是对文件后缀做分析。

使用linux 下的hexdump十六进制查看器的代码如下:

1 #!/usr/bin/env python

2 #_*_coding=utf-8_*_

3

4 importsubprocess5 importgetopt6 importsys7 importos8

9 if __name__=='__main__':10 try:11 opts, args = getopt.getopt(sys.argv[1:], "")12 exceptgetopt.GetoptError, err:13 printstr(err)14 sys.exit(2)15 #check if the zipfile exists

16 for arg inargs:17 if notos.path.isfile(arg):18 print "%s does not exists!" %arg19 sys.exit(2)20 #verify the zipfile

21 f = subprocess.Popen(['hexdump', '-n', '8', "%s" % arg], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].rstrip()22 if f[23:27]=='0009':23 print "%s 是加密文件" %arg24 elif f[23:27]=='0000':25 print "%s 不是加密文件" %arg26 else:27 print "error"

2. 使用python自带的方法判断的代码如下:

1 #!/usr/bin/env python

2 #_*_coding=utf-8_*_

3

4 importsubprocess5 importgetopt6 importsys7 importos8

9 if __name__=='__main__':10 encryptedzip='\t\x00'

11 unencryptedzip='\x00\x00'

12 zipfile='PK\x03\x04'

13 try:14 opts, args = getopt.getopt(sys.argv[1:], "")15 exceptgetopt.GetoptError, err:16 printstr(err)17 sys.exit(2)18 #check if the zipfile exists

19 for arg inargs:20 if notos.path.isfile(arg):21 print "%s does not exists!" %arg22 sys.exit(2)23 #verify the zipfile

24 try:25 f=open("%s" % arg, "rb")26 top8hex=f.read(8)27 if top8hex[6:] ==encryptedzip:28 print "%s 是加密文件" %arg29 elif top8hex[6:] ==unencryptedzip:30 print "%s 不是加密文件" %arg31 elif not top8hex[:4] ==zipfile:32 print "%s 不是zip文件!" %arg33 exceptIOError, err:34 printstr(err)35 finally:36 f.close()

以上两种方法虽然是命令行程序,但是同样可以运用到cgi中。

如果有人能提供更到位、更精确的分析方法,请赐教:)

python解压加密zip文件_Python:解压缩前检测一个zip文件否为加密,两种算法。相关推荐

  1. python解压版怎么安装_python 解压版 zip file 安装

    python 解压版 zip file 安装 Python Releases for Windows 找到最新稳定版本的 "Download Windows x86-64 embeddabl ...

  2. python解压zip文件_python-29 python解压压缩包的几种方法

    这里讨论使用Python解压例如以下五种压缩文件: .gz .tar .tgz .zip .rar 简单介绍 gz: 即gzip.通常仅仅能压缩一个文件.与tar结合起来就能够实现先打包,再压缩. t ...

  3. linux+shell+解压命令,Shell命令 文件压缩解压缩之gzip、zip详解

    本篇文章的主要内容讲述的是shell命令中之文件压缩解压缩之gzip.zip,具有一定参考价值,感兴趣的朋友可以了解一下,希望对你有所帮助. 1.gzip:gzip压缩工具 gzip命令的功能说明: ...

  4. python解压7z文件_Python调用7zip命令实现文件批量解压

    Python调用7zip命令实现文件批量解压 1.输入压缩文件所在的路径 2.可以在代码中修改解压到的文件路径和所需要解压的类型,列入,解压文件夹下面所有的mp4格式的文件 3.cmd 指的就是Pyt ...

  5. Python解压zip文件出现TypeError: pwd: expected bytes, got str的解决方案

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  6. python解压rar_Python解压 rar、zip、tar文件的方法

    Q1 :如何解压 rar 压缩包文件? A : Step1:检查是否有 rarfile 第三方库,若没有该模块,则需要进行安装 : Step2:参考代码如下: import rarfile impor ...

  7. Python 解压rar类型文件

    Python 解压rar类型文件 一.前提准备 1. pip install rarfile 2. 在官网下载 WinRAR安装包 ,安装完毕后在安装目录即可找到一个名为 "UnRAR.ex ...

  8. Windows下使用python解压tgz文件

    浅记以备自用 有时候下载的数据集压缩包可能是tgz格式,在windows下使用常规的解压缩软件无法解压,可以使用python解压tgz文件. Step1.载入模块 import tarfile Ste ...

  9. python解压文件到指定路径

    os.walk(path)返回(root,dirs,files) os.path.isfile()判断是否是文件 zipfile.is_zipfile(file_path)判断是否是zip文件 imp ...

最新文章

  1. NODE Stream流总结(1)
  2. Linux下tomcat安装及优化
  3. 【.NET Core 3.0】小技巧 || 原生DI一对多注入
  4. Flowable工作流入门
  5. jQuery 属性操作 - toggleClass() 方法
  6. 成员变量与局部变量的区别
  7. win10错误代码0x0000011b怎么解决
  8. 计算机变成英语,win10系统下计算器界面变成英文界面了怎么办
  9. 分散式云存储,元宇宙数据存储基建
  10. Alibaba(实习准备)—SOFARPC学习总结
  11. 关于VMD相关介绍(一)
  12. SQL Server选择题40个
  13. 小米扫地机器人粉尘盒_小米扫地机器人尘盒怎么打开
  14. Error response from daemon: conflict: unable to delete a9ac6b268134 (must be forced) - image is bein
  15. Python「剪藏」网页为 PDF
  16. openGL平行光、点光、聚光
  17. 白帽子(5)- 命令注入与代码注入区别
  18. 闸门机制(Gate Mechanism)
  19. python爬取歌曲的全部评论
  20. 灵感:从想法的天空到现实的地面

热门文章

  1. HTML5游戏引擎Playcraft将于近日正式启动
  2. Javascript玩转Prototype(一)——先谈C#原型模式
  3. android 跳转页面出错,Android 页面跳转(无/含有返回结果)
  4. linux定时任务清理cache缓存
  5. java 实现 常见排序算法(一) 冒泡排序
  6. Can't process attribute android:fillColor=@color/gray,添加vector属性报错解决方法
  7. android 动态设置View的高度和宽度,ViewTreeObserver使用
  8. typescript 安装
  9. Linux平台上最常用的翻译工具—StarDict(星际译王)。
  10. IE本地网页弹出黄条“限制网页脚本”