crc32碰撞 ctf python

刚学ctf遇到crc32碰撞的题。
直接上代码。

import string
import threading
import binascii
import sys


def crc(_crc):
    l = 1
    dic = string.printable
    _input = _crc
    _input = "0X" + _input
    for i in dic:
        for n in dic:
            for h in dic:
                for m in dic:
                    s = i + n + h + m
                    s = s.encode()
                    # print(str(binascii.crc32(s)), _input)
                    if hex(binascii.crc32(s)).upper() == _input.upper():
                        print(_crc, ':', s.decode())
                        print(l)
                        sys.exit()  #直接退出,不进行接下来的碰撞了,一般在做题的时候,碰撞不会重复
                    l = l + 1


def crc32():
    print("四字节碰撞!!!")
    num = int(input("你可能需要多个线程同时进行碰撞,请输入线程数:"))
    _thread = []
    _args = []
    print("输入参数")
    for i in range(num):
        print(i+1, end=':')
        _args.append(input())
    # print(_args)
    for i in range(num):
        t = threading.Thread(target=crc, args=(_args[i],))
        _thread.append(t) #如果在这里开始线程会出一点小bug,虽然不要紧,但是不好看,不信的话你们自己试试
    # print(_thread)
    for i in range(num):
        _thread[i].start()
    for i in range(num):
        _thread[i].join()
    input()


if __name__ == '__main__':
    crc32()

我看了其他人写的代码,他们都没有加多线程,python的多线程虽然不是正儿八经的多线程,但是这么写以后用起来比较方便(一次性输入所有的crc32校验码,然后一次性算出来)
注意
一般情况,碰撞的字节数不会超过5(通常是3或者4字节),否则要碰撞很久,碰撞时间太久的话这个题就没什么意思了。一般看见压缩包里有很多文件,每个文件大小都小于5字节,才会用crc32碰撞。

你可能感兴趣的:(crc32碰撞 ctf python)