破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)

zip伪加密


 zip文件是由3部分组成,详见文末

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志

在压缩源文件数据区有个2字节的 全局方式位标记 ,在压缩源文件目录区也有个2字节的 全局方式位标记 ,都用以标记是否加密,如下图:

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第1张图片

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第2张图片

 

若是没有加密的zip,两处标记都是00 00

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第3张图片

 

加密的zip两次都不是00 00,好像不同版本的压缩软件或是算法,这里的值会不同,我看之前网上多见的是09 00

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第4张图片

 

若把未加密的zip压缩源文件目录区的全局方式位标记改为 01 00 (或者 09 00),就会被压缩软件认为是已加密,即所谓的伪加密

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第5张图片

 

破解伪加密的zip,只要把压缩源文件目录区的全局方式位标记改为 00 00 即可解压

 

 

爆破


详分有暴力,掩码,字典

1.暴力:选择密码范围,长度等,由软件组合生成密码进行爆破

2.掩码:知道密码中的一部分,只需按规则构造其余部分

3.字典:通常是多数用户常用的一些密码集合,导入字典文件用其中的密码进行爆破

推荐一款windows下的软件 advanced zip password recovery

用法的话,百度就很多了

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第6张图片

 

我写过一个简单的通过字典爆破zip的python脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import zipfile
import os

def extractFile(zFile,password):
    try:
        zFile.extractall(path=os.getcwd(),pwd=password)
    except:
        return False
    else:
        return password

def main():
    zFile=zipfile.ZipFile(raw_input('zip file:'))
    passFile=open(raw_input('password file:'))

    for password in passFile.readlines():
        print password
        password=password.strip('\n')
        result=extractFile(zFile,password)
        if result:
            print 'success:'+result
            break

if __name__=='__main__':
    main()

raw_input('press any key to exit')

 

 

CRC32碰撞


CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。

总之每个文件都有唯一的CRC32值,即便数据中一个bit发生变化,也会导致CRC32值不同。若是知道一段数据的长度和CRC32值,便可穷举数据,与其CRC32对照,以此达到暴力猜解的目的。但通常只适用于较小文本文件。

比如这里有一个加密的rar,直接双击就可以看见其中信息,而且我知道其中全是数字,便可写脚本爆破

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第7张图片

 

 1 from zlib import crc32
 2 import random
 3 
 4 char='0123456789'
 5 
 6 def crc32_f(data):
 7     return hex(crc32(data)&0xffffffff)[2:10]
 8 
 9 length=input('length:')
10 crc32_=raw_input('crc32:').lower()
11 
12 while True:
13     text=''
14     for i in range(length):
15         text+=char[random.randint(0,len(char)-1)]
16     if crc32_f(text)==crc32_:
17         raw_input('find it:'+text)
18         exit

python2中的crc32()计算的crc32值是有符号的,所以&0xffffffff转换成无符号数值

 

由于全是数字,7位也不算太高,跑了3分钟左右便出结果了

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第8张图片

 

 

已知明文攻击


 如果得到了加密压缩包中的某个文件,那么就可以通过明文攻击来获取压缩密码

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第9张图片

 

这里得到了163264.txt文件,以及一个加密的misc2.zip,misc2.zip中的文件即是我们得到的这个文件,先将已知的文件压缩,从CRC32也可以看出两个文件是一样的

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第10张图片

 

然后在软件中选择明文(plain-text),填入路径点击开始

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第11张图片

 

我跑了大约一两分钟

破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)_第12张图片

 

如果出现以下错误,那么一般就是你使用的压缩软件或是压缩算法和待破解的压缩包所使用的软件不同,可以用WinRAR,7z,2345好压等都试一下

 No matching files in selected archives.If you'd like to run plaintext attack using only part of the file, please modify the archives so each of them will contain one file only.

 在选定的档案中没有匹配的文件。如果您想要仅使用文件的一部分执行明文攻击,请修改档案,使每个档案中只包含一个文件。

 

 

参考:

zip文件构成:https://blog.csdn.net/wclxyn/article/details/7288994

 

转载于:https://www.cnblogs.com/leixiao-/p/9824557.html

你可能感兴趣的:(破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击))