忘记zip密码咋办?python在手密码我有
整理资料时发现几个 zip 文件的密码忘记了,于是尝试用python暴力破解
首先是读取和解压zip文件,使用 zipfile 库
import zipfile
z = zipfile.ZipFile(r'./file.zip')
z.extractall(pwd=password.encode('utf-8'))
定义一个密码元字符串,每次从里面取出一些字符,比如:
meta_str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
随机密码
使用 random.sample 生成指定长度的密码,然后出现过的密码放入一个 set
choiced_set = set()
rand_str = ''.join(random.sample(meta_str, 4))
if rand_str not in choiced_set:
choiced_set.add(rand_str)
为了不断的产生密码并尝试解压,此处应该有循环,那么将尝试解压和生成密码封闭为函数:
import zipfile
import random
meta_str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
choiced_set = set()
def guess(z, password):
try:
z.extractall(pwd=password.encode('utf-8'))
print('guessed pwd: {}'.format(password))
return True
except Exception:
print('invalid password [{}]'.format(password))
return False
def main():
z = zipfile.ZipFile(r'./file.zip')
while True:
rand_str = ''.join(random.sample(meta_str, 4))
if rand_str not in choiced_set:
choiced_set.add(rand_str)
if guess(z, rand_str):
raise Exception('found')
此方法代码里固定写了只支持4个字符长度,若密码不是4个字符,则会无止境的循环下去,显然不科学。
为了支持n位密码字符,需对代码稍加修改:
- 增加n位字符, for x in range(n) 可以解决
- n位密码长度的中止条件
密码个数
由于将生成的密码全部放入set,所以只需要判断set的长度,就知道当前生成了多少密码。
而密码字符可以重复,所以'abcd' 可生成的2位密码有:
'aa', 'ab', 'ac', 'ad',
'ba', 'bb', 'bc', 'bd',
'ca', 'cb', 'cc', 'cd',
'da', 'db', 'dc', 'dd,
相当于对字符串'abcd' 和 'abcd' 作笛卡尔积,那么一共是 len('abcd') * len('abcd') = 16 个密码,
所以n位密码的个数就是 len(meta_str) ** n
random.sample 不支持重复字符,替换为 numpy.random.choice(sq, n, replace=True)
引入 numpy 并修改 main 函数:
def main():
z = zipfile.ZipFile(r'./file.zip')
meta_str_len = len(meta_str)
meta_str_list = list(meta_str)
while True:
for n in range(1, 5):
while len(choiced_set) != meta_str_len ** n:
rand_str = ''.join(np.random.choice(meta_str_list, n, replace=True))
if rand_str not in choiced_set:
choiced_set.add(rand_str)
if guess(z, rand_str):
raise Exception('found')
choiced_set.clear()
耗时
以上代码虽然可以正常运行,但是解一个4位长度的密码需要计算 62 * 62 * 62 * 62 = 14776336 次,而且随着 choiced_set 的增长,生成非重复密码的概率越来越低,几乎是一个不可能完成的任务。
字母顺序密码
如果按顺序生成密码,总有一个密码能满足条件,比如: 元字符'abcd'生成2位密码,是一个笛卡尔积,其实就是一个字符全排列的过程,所以这里可以使用深度优先算法生成字符
调用 dfs_str(0) 即可不断生成 4 位长度的密码
一个简单的栗子:
def guess(v):
if v == 'abcd':
print('guessed pwd: {}'.format(v))
return True
else:
print('invalid pwd: {}'.format(v))
return False
meta_str = 'abcd1234'
chars = []
def dfs_str(step):
if step >= 4:
if guess(''.join(chars)):
raise Exception('found')
return
for ch in meta_str:
chars.append(ch)
dfs_str(step + 1)
chars.pop()
密码生成器
使用这种方式 guess 函数处于深度优先搜索算法中,耦合紧密,那么有没有办法一次生成一个密码,然后传给 guess 呢?当然是有的,这时候轮到生成器出场了
实现一个密码生成器,只需要一些小的改动,在函数里增加 yield 关键字
def dfs_str_gen(step):
if step >= 4:
yield ''.join(chars)
return
for ch in meta_str:
chars.append(ch)
yield from dfs_str_gen(step + 1)
chars.pop()
密码生成器类
上面的代码已经限定了只能生成 4 位长度的密码,然而我们的密码可能是 1 2 3 4 5 甚至8位以上,难道每次都要手动修改吗?或者是在 dfs_str_gen 里传入参数?
当然传参可以,离我的目标很近了,然而更好的办法是包装成一个 class, 初始化时传入想要生成密码的长度:
class PasswordGenerator:
meta_str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
def __init__(self, n=4):
self.maxlen = n
self.endstr = self.meta_str[-1] * self.maxlen # 标记循环结束字符串
self.chars = []
self.g = self._proxy_gen()
def _dfs_str(self, step):
if step >= self.maxlen:
yield ''.join(self.chars)
return
for ch in self.meta_str:
self.chars.append(ch)
yield from self._dfs_str(step + 1)
self.chars.pop()
def _proxy_gen(self):
while True:
yield from self._dfs_str(0)
def __iter__(self):
return self
def __next__(self):
s = self.g.send(None)
if s == self.endstr:
self.g.close()
return s
调用 PasswordGenerator(n) 即可生成 n 位长度的密码
itertools 生成器
写了这么多,其实标准库 itertools 已经有了解决方案
import itertools
meta_str = 'abcdefg'
itertools.product(meta_str, repeat=4)
忘记zip密码咋办?python在手密码我有的更多相关文章
- Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作
# -*- coding: gb2312 -*- #用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作 #作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.co ...
- 忘记原来的myql的root的密码;
修改的用户都以root为列.一.拥有原来的myql的root的密码: 方法一:在mysql系统外,使用mysqladmin# mysqladmin -u root -p password " ...
- centOS7忘记密码,修改root账号密码
centOS7忘记密码,修改root账号密码 RHEL7 的世界发生了变化,重置 root 密码的方式也一样.虽然中断引导过程的旧方法(init=/bin/bash)仍然有效,但它不再是推荐的.“Sy ...
- 经典问题(c++/python)素数、杨辉三角(金字塔型)、统计单词数、简单计算器、密码安全程度、凯撒密码加密、汉诺塔 (python课设实验实例)-- biaobiao88
[编写程序,输人一个大于2的自然数,然后输出小于该数字的所有素数组成的列表.]所谓素数,是指除了1和自身之外没有其他因数的自然数,最小的素数是2,后面依次是3.5.7.11.13... c++代码: ...
- 忘记VMware vcenter的Administrator@vsphere.local密码
忘记VMware vcenter的Administrator@vsphere.local密码的解决办法一. 重置密码:ssh root@192.168.230.100Connecting to 192 ...
- 使用Mysql修改密码命令更改root的密码
使用Mysql修改密码命令更改root的密码. 进入Mysql数据库命令行方式有两种方式: 方式一:在Mysql开始菜单里包含Mysql命令行客户端,只要点击输入root的密码即可进入. 方式二:在D ...
- 搭建web之 服务器鉴权失败,请确认服务器已启用密码鉴权并且账号密码正确?
实例化时,登录过程中出现 服务器鉴权失败! 这是由于密码错误所致! 第一种情况:原始随机密码 第一种情况,你没有修改密码,则可以直接查找原始密码: 过程详见官网 使用密码登录的前提条件 密码: 若用户 ...
- ecshop2.73修改密码方法|ecshop2.73修改密码方法
ecshop2.73修改密码方法|ecshop2.73修改密码方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2012-09-09 ecshop2.73正式版后 ...
- 利用phpmyadmin修改mysql的root密码及如何进入修改密码后的phpmyadmin
1.利用phpmyadmin修改mysql的root密码 很多人利用phpmyadmin或者命令行来修改了mysql的root密码,重启后发现mysql登录错误,这是为什么呢?修改mysql的root ...
随机推荐
- 【转】Flex 布局教程:语法篇
作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + floa ...
- Linux目录结构说明
文件系统层级标准(filesystem hierarchy standard,FHS). http://www.pathname.com/fhs/pub/fhs-2.3.html 以下是对这些目录的解 ...
- 设计的一些kubernetes面试题
公司现在上了一部分的业务至k8s,老实说,我心里很慌,在项目改造中,每天都会遇到很多问题,好友找我出一份k8s面试题,参考了网上的一些,再加上自己公司遇到的一些问题,整理如下: 参考链接:http:/ ...
- 【AIX】3004-314 Password was recently used and is not valid for reuse
[AIX]3004-314 Password was recently used and is not valid for reuse 一.1 BLOG文档结构图 一.2 前言部分 ...
- 我的oracle 健康检查报告
最近一直想用sql来生成oracle的健康检查报告,这样看起来一目了然,经过网上搜资料加自己整理终于算是成型了,部分结果如下图所示, 具体参考附件,恳请广大网友看看是否还有需要添加的地方. DB_he ...
- 关于git报 warning: LF will be replaced by CRLF in README.md.的警告的解决办法
在使用git把代码上传至仓库时,会有下面这种警告: 虽然说是警告,但是看着真的很碍眼啊,特别是有强迫症的人就更难受了. 输入这一行命令就可以完美解决了 git config core.autocrlf ...
- PHP、JS 中 encode/decode
PHP : urlencode() urldecode() JS : encodeURIComponent() decodeURIComponent() 同一字符串,编码后的结果一样 1
- Notepad++常用快捷键:
Ctrl-H 打开Find / Replace 对话框 Ctrl-D 复制当前行 Ctrl-L 删除当前行 Ctrl-T 上下行交换 F3 找下一个 Shift-F3 找上一个 Ctrl-Shift- ...
- spring cloud (二) 服务提供者 EuekaClient
1 创建一个springboot项目 spring-cloud-service-a 注册到eureka服务注册中心中 项目添加依赖 <dependency> <groupId&g ...
- scrapy框架用CrawlSpider类爬取电影天堂.
本文使用CrawlSpider方法爬取电影天堂网站内国内电影分类下的所有电影的名称和下载地址 CrawlSpider其实就是Spider的一个子类. CrawlSpider功能更加强大(链接提取器,规 ...