crc 32衝突ctf python

8080 ワード

ctfを習ったばかりでcrc 32の衝突の問題に出会った.直接コードをつける.
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のマルチスレッドはまともなマルチスレッドではありませんが、このように書くと使いやすくなります(すべてのcrc 32チェックコードを一度に入力して、一度に計算します)一般的に、衝突のバイト数は5(通常は3または4バイト)を超えません.そうしないと衝突が長くなります.衝突時間が長すぎるとこの問題は面白くない.一般的に圧縮パッケージには多くのファイルがあり、各ファイルサイズは5バイト未満でcrc 32で衝突します.