python 通过crc32得到加密文件内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 通过crc32得到加密文件内容相关的知识,希望对你有一定的参考价值。

参考技术A crc检验原理实际上就是一个p位二进制序列之后附加一个r位二进制检验码(序列), 从而构成一个总长为n=p+r位的二进制序列, 附加在数据序列之后的这个检验码与数据序列的内容之间存在这某种特定的关系. 如果干扰因素使数据序列中的某一位或者某些位发生变化,这种特定的关系就会被破坏, 因此通过这种特性可以利用来爆破文件的内容.

文件的内容只有相同的时候他的crc校验才会一样.只要已知压缩文件的长度已知就可以获取他的crc32值来与我们的内容计算得到的值进行相互比较, 从而得到文件内容.(前提是文件内容长度够小才可以通过这种方法来实现,否则内容过长pc的算力有限)

现在有一个flag.zip 里面有一个flag.txt 文件 密码未知

使用模块如下:

得到文件的内容为4个字节长度

字典模块通过string模块得到

调用:

如果文件内容过长的话, 通过这种方式就不现实了.

解压文件得到如下的压缩文件

得到每个压缩包都是4个字节的大小, 压缩的文件为data.txt, 通过脚本得到文件内容, 脚本如下:

运行结果部分如下:

可以看见才多长这个东西很考验pc的性能, 然后直接进行base64解码, 得到的内容转为rar格式的文件, 然后补全文件头得到flag, 这里具体就不阐述了

得到的内容如下:

个人网站

Python中无需解压即可计算zip内容的CRC32、MD5和SHA1

【中文标题】Python中无需解压即可计算zip内容的CRC32、MD5和SHA1【英文标题】:Calculate CRC32, MD5 and SHA1 of zip content without decompression in Python 【发布时间】:2017-10-21 14:43:00 【问题描述】:

我需要计算 zip 文件内容的 CRC32、MD5 和 SHA1,而不需要解压。

到目前为止,我发现了如何为 zip 文件本身计算这些,例如:

CRC32:

import zlib


zip_name = "test.zip"


def Crc32Hasher(file_path):

    buf_size = 65536
    crc32 = 0

    with open(file_path, 'rb') as f:
        while True:
            data = f.read(buf_size)
            if not data:
                break
            crc32 = zlib.crc32(data, crc32)

    return format(crc32 & 0xFFFFFFFF, '08x')


print(Crc32Hasher(zip_name))

SHA1:(类似MD5)

import hashlib


zip_name = "test.zip"


def Sha1Hasher(file_path):

    buf_size = 65536
    sha1 = hashlib.sha1()

    with open(file_path, 'rb') as f:
        while True:
            data = f.read(buf_size)
            if not data:
                break
            sha1.update(data)

    return format(sha1.hexdigest())


print(Sha1Hasher(zip_name))

对于zip文件的内容,我可以直接从zip中读取CRC32,无需计算如下:

读取 zip 内容的 CRC32:

import zipfile

zip_name = "test.zip"

if zip_name.lower().endswith(('.zip')):
    z = zipfile.ZipFile(zip_name, "r")

for info in z.infolist():

    print(info.filename,
          format(info.CRC & 0xFFFFFFFF, '08x'))

但我不知道如何在不先解压缩压缩文件的情况下计算 zip 文件内容的 SHA1(或 MD5)。 这有可能吗?

【问题讨论】:

【参考方案1】:

这是不可能的。您可以获得 CRC,因为它是在创建存档时为您仔细预先计算的(用于完整性检查)。任何其他校验和/哈希都必须从头开始计算,并且至少需要归档内容的流式传输,即解包。

UPD:可能的实现

libarchive:额外依赖,支持多种归档格式

import libarchive.public as libarchive
with libarchive.file_reader(fname) as archive:
    for entry in archive:
        md5 = hashlib.md5()
        for block in entry.get_blocks():
            md5.update(block)
        print(str(entry), md5.hexdigest())

原生zipfile:无依赖,仅压缩

import zipfile

archive = zipfile.ZipFile(fname)
blocksize = 1024**2  #1M chunks
for fname in archive.namelist():
    entry = archive.open(fname)
    md5 = hashlib.md5()
    while True:
        block = entry.read(blocksize)
        if not block:
            break
        md5.update(block)
    print(fname, md5.hexdigest())

【讨论】:

感谢您的回答。什么是最节省内存的方法?

以上是关于python 通过crc32得到加密文件内容的主要内容,如果未能解决你的问题,请参考以下文章

MISC:压缩包取证(zip爆破明文攻击伪加密CRC32碰撞)

MISC:压缩包取证(zip爆破明文攻击伪加密CRC32碰撞)

求助crc32的原理

Python中无需解压即可计算zip内容的CRC32、MD5和SHA1

[转载]CRC32加密算法原理

CRC原理总结