头歌Python实训——Python计算思维训练——密码破解和电子取证

第1关:zip压缩文件暴力破解

任务描述

本关任务:编写一个能暴力破解加密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 **********#

第2关:黑客Alex Tapanaris与PDF文档

任务描述

本关任务:编写一个能读取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 **********#

第3关:学术论文信息提取

任务描述

本关任务:编写一个能读取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 **********#

你可能感兴趣的:(头歌实训,python)