任务描述
本关任务:编写一个能暴力破解加密Zip文件的小程序。
相关知识
暴力密码破解方法
对于一个zip格式的压缩包,默认密码是6位数字。暴力破解的基本思路是,调用Python中的zipfile模块的trypassword函数,尝试从0到999999的所有数字,成功解压时即为相应的压缩密码。
在上一节中我们介绍了暴力密码破解的思路和方法,其存在一个问题就是破解速度慢。 那么,有没有更快的办法呢?
我们前面采用单线程速度比较慢,那么我们可以采用多个线程分片负责的思路,将0到999999进行分片,每个区间由一个线程负责,多个线程同时并行处理,这样可以将破解速度提高多倍。
基于字典的密码破解
对于密码是纯数字的,我们可以采用上述暴力破解的思路。如果密码的字符集和长度均未知时该如何破解呢?我们可以采用基于字典的密码破解方法。
编程要求
有一个加密的Zip格式的压缩文件step1/noname.zip,它的密码未知。
现在已知密码是**6位纯数字**,请在右侧编辑器中的Try函数中,尝试破解这个文件的密码,并将其密码返回。
评测系统会尝试使用这个密码解压step1/noname.zip,如果解压成功,则会输出解压成功,否则会输出解压失败。
提示:密码数字不会太大,可以从000000开始尝试。
测试说明
使用密码成功解压时输出的解压成功即为通关条件。
代码内容
import zipfile
def Try():
path = 'step1/noname.zip' #压缩文件路径
#破解并返回密码
# 请在此添加实现代码 #
# ********** Begin *********#
def trypassword(zip_file, password): # 已知密码进行解密
flag = False # 标记位flag
try:
zip_file.extractall(pwd=bytes(password, 'ascii'))
# print("密码:" + password)
flag = True
except:
pass
return flag
zip_file = zipfile.ZipFile(path, 'r')
N = 10**6 # 六位数字密码 最大不超过10**6
flag = False
password = '000000'
for number in range(N):
if not flag:
password = '%06d' % number # 数字转字符串 不足补前
flag = trypassword(zip_file, password)
else:
break
zip_file.close()
return password
'''
# 获取密码进行破解
zip_file = zipfile.ZipFile(path, 'r')
password = "194168"
zip_file.extractall(pwd=bytes(password, 'ascii'))
zip_file.close()
return password
'''
# ********** End **********#
本关任务:编写一个能读取PDF元数据的小程序。
课程视频《大学计算 - 电子取证》
现有一份来自黑客组织Anonymous
的PDF新闻稿step2/ANONOPS_The_Press_Release.pdf
。
当时这份稿件发出没多久,希腊警方就在稿件的元信息中发现了作者Alex Tapanaris
的名字,然后以此为证据将其逮捕,也就是所谓的电子取证。
在右侧编辑器中有一个Evidence
函数,它有一个参数path
,代表这个PDF的路径,或者是另一个类似的PDF文件的路径,它们的区别仅在于元数据上。
请你在这个函数中读取指定新闻稿的元数据,并将其按照<属性名> : <属性值>
的格式打印出来。
注意:从PDF中读取的属性名会包含一些非字母符号,请在显示之前去掉这些符号。如果不知道有哪些符号,可以先输出一下原始的内容观察一下。
测试数据由评测系统读取并传递给Evidence
函数,期间产生的输出将会与规定的输出进行比较,详细要求请见测试说明。
如果输入的是:
step2/ANONOPS_The_Press_Release.pdf
那么应该得到的是:
Author : Alex Tapanaris
Creator : Writer
Producer : OpenOffice.org 3.2
CreationDate : D:20101210031827+02'00'
即**测试集1
**的预期输出。
代码内容
import PyPDF2
def Evidence(path):
#读取并打印PDF的元信息
# 请在此添加实现代码 #
# ********** Begin *********#
with open (path,'rb') as file:
pdf_reader = PyPDF2.PdfFileReader(file) # 创建PdfFileReader对象
metadata = pdf_reader.getDocumentInfo() # 读取元信息
for key,value in metadata.items():
print(key.replace("/",""),":" ,value)
# ********** End **********#
本关任务:编写一个能读取PDF元数据的小程序。
现有一篇PDF格式的学术论文step3/ICSE2014.pdf
。
右侧编辑器中有一个函数Read
,它有一个参数path
,代表这个PDF的路径,或者是另一个类似的PDF文件的路径,它们的区别仅在于元数据上。
请在这个函数中读取指定论文元数据中的标题、作者、关键字、最后一次修改日期四个属性,并将其按照(<编号>)<属性名> : <属性值>
的格式输出。
要求:
<编号>
是按输出顺序编号为1-4
。
<属性名>
要求使用上面的汉字。
最后一次修改日期的属性值要求按照XXXX年XX月XX日
的格式输出(需要分析原始数据中哪一部分是年、月、日)。
提示:如果不知道这几个属性对应的英文名是什么,可以先打印出所有信息看一看。
测试数据由评测系统读取并传递给Read
函数,期间产生的输出将会与规定的输出进行比较,详细要求请见测试说明。
如果输入的是:
step3/ICSE2014.pdf
那么应该得到的是:
(1)标题 : The Strength of Random Search on Automated Program Repair
(2)作者 : Yuhua Qi, Xiaoguang Mao, Yan Lei, Ziying Dai, and Chengsong Wang
(3)关键词 : Automated program repair; random search; genetic programming; search-based software engineering
(4)最后一次修改日期 : 2014年02月23日
上述输出内容为**测试集1
**的预期输出。
代码内容
import PyPDF2
def Read(path):
#读取并打印PDF的元信息
# 请在此添加实现代码 #
# ********** Begin *********#
with open (path,'rb') as file:
pdf_reader = PyPDF2.PdfFileReader(file) # 创建PdfFileReader对象
metadata = pdf_reader.getDocumentInfo() # 读取元信息
attributes = ['/Title', '/Author', '/Keywords', '/ModDate'] # 文档信息的属性名称
attributeShow = ['标题', '作者', '关键词', '最后一次修改日期']
attributeValue = [] # 存放提取的各属性的值
for attr in attributes:
attributeValue.append(metadata[attr])
# 按照格式输出
attributeValue[3] = attributeValue[3][2:6]+'年'\
+attributeValue[3][6:8]+'月'\
+attributeValue[3][8:10]+'日'
for i in range(len(attributes)):
print('(%d)' %(i+1) + attributeShow[i]+' : '+attributeValue[i])
# ********** End **********#