Python破解ZIP密码实战:单线程、多线程与混合字符策略对比

远山来客
远山来客
发布时间:2026-10-14 | 1人浏览过
原创

本文详细解析使用Python破解ZIP文件密码的三种策略:纯数字单线程、纯数字多线程及英文加数字混合类型。通过对比代码实现与运行耗时,指出多线程在纯数字遍历中优势有限,并提供了处理不确定长度密码的迭代器方案。

单线程破解纯数字密码方案

第一种方案采用单线程方式尝试破解仅包含数字的密码。

需要特别注意,该方案生成的密码不包含以数字0开头的组合。


import zipfile,time,sys
start_time = time.time()
def extract():
  zfile = zipfile.ZipFile('IdonKnow.zip')#读取压缩包,如果用必要可以加上'r'
  for num in range(1,99999,1):
    try:
      pwd = str(num)
      zfile.extractall(path='.',pwd=pwd.encode('utf-8'))
      print ("当前压缩密码为:",pwd)
      end_time = time.time()
      print ('单线程破解压缩包花了%s秒'%(end_time-start_time))
      sys.exit(0)
    except Exception as e:
      pass
if __name__=="__main__":
  extract()

以下是该方案执行后的具体破解结果展示。

多线程破解纯数字密码方案

第二种方案引入多线程机制,旨在加速纯数字密码的破解过程。

同样地,此方案也不涵盖以数字0开头的密码情况。


import zipfile,time,threading

start_time = time.time()
flag = True # 用于判断线程是否需要终止,为True时程序执行

def extract(password, file):
  try:
    password = str(password)
    file.extractall(path='.', pwd=password.encode('utf-8'))
    print ("当前压缩密码为:",password)
    end_time = time.time()
    print ('多线程破解压缩包花了%s秒'%(end_time-start_time))
    global flag
    flag = False#成功解压其余线程终止
  except Exception as e:
    pass
def main():
  zfile = zipfile.ZipFile("test.zip", 'r')
  for number in range(1, 99999,1):
    if flag:
      thr1 = threading.Thread(target=extract, args=(number, zfile))
      thr2 = threading.Thread(target=extract, args=(number, zfile))
      
      thr1.start()
      thr2.start()
      
      thr1.join()
      thr2.join()
if __name__ == '__main__':
  main()

以下是多线程模式下的实际破解结果数据。

经验提示:对于纯数字类型的密码破解,多线程带来的性能提升并不显著。

英文与数字混合密码破解方案

第三种方案针对包含英文字母和数字的混合密码进行破解尝试。


import random,zipfile,time,sys

class MyIter():
  cset = 'abcdefghijklmnopqrstuvwxyz0123456789'
  def __init__(self,min,max):#迭代器实现初始方法,传入参数
    if min < max:
      self.minlen = min
      self.maxlen = max
    else:
      self.ninlen = max
      self.maxlen = min
  def __iter__(self):#直接返回slef实列对象
    return self
  def __next__(self):#通过不断地轮循,生成密码
    rec = ''
    for i in range(0,random.randrange(self.minlen,self.maxlen+1)):
      rec += random.choice(MyIter.cset)
    return rec
def extract():
  start_time = time.time()
  zfile = zipfile.ZipFile('test1.zip','r')
  for password in MyIter(1,4):#随机迭代出1~4位数的密码,在不明确位数的时候做相应的调整
    if zfile:
      try:
        zfile.extractall(path='.',pwd=str(password).encode('utf-8'))
        print ("当前压缩密码为:",password)
        end_time = time.time()
        print ('当前破解压缩包花了%s秒'%(end_time-start_time))
        sys.exit(0)
      except Exception as e:
        print ('pass密码:',password)
        pass
if __name__=="__main__":
  extract()

以下是混合字符密码破解的具体结果输出。

综合总结部分对上述几种方法进行了回顾与评估。

以上内容介绍了利用Python破解ZIP文件密码的几种常用方法,希望能为读者提供有价值的参考。若有任何疑问,欢迎留言交流,小编会及时回复。感谢大家对本网站的支持!如果您觉得本文对您有帮助,欢迎转载,请注明出处,谢谢!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表