2014-01-14 44 views
0

我正在尝试散列,并且我想将323322056的输出与base64字符串匹配,以使它们的crc32值相等。散列函数没有响应

test1.py

import binascii 
result = binascii.crc32('supersecretpassword') 
print(result) #323322056 

test2.py

import binascii, socket, base64 

socket.setdefaulttimeout(0) 

i = 0 
while True: 
    if binascii.crc32(base64.encodestring(i)) == 323322056: 
     print(base64.encodestring(i)) 
     i += 1 

我收到此错误:

TypeError: object of type 'int' has no len() 

完整堆栈跟踪

Traceback (most recent call last): 
    File "C:/Users/Ajay/PycharmProjects/itertools/test.py", line 6, in <module> 
    if binascii.crc32(base64.encodestring(i)) == 323322056: 
    File "C:\Python27\lib\base64.py", line 313, in encodestring 
    for i in range(0, len(s), MAXBINSIZE): 
TypeError: object of type 'int' has no len() 

预期输出:

MTIxMjY5MTAwNg== 

,从而满足此条件:

import binascii 

print(binascii.crc32("MTIxMjY5MTAwNg==")) 
# 323322056 
+0

你是什么例外的全面回溯?那么'socket.setdefaulttimeout(0)'与你的问题有什么关系? –

+0

你打算蛮力强制CRC32值吗?然后请注意,不同长度的所有空值的字节串会产生不同的“base64”值。用这种方式强制密码确实需要很长的时间。 –

+0

@MartijnPieters是的,我只是尝试选项:D – ajkumar25

回答

1

您试图编码的整数值:

base64.encodestring(i) 

base64.encodestring()函数需要一个字节串作为输入。您的意思是使用:

base64.encodestring(bytes((i,))) 

也许?然而,这只能工作到i = 255。为了生产增加长度,包括空值的字节串,你可以使用一个发电机功能:

from itertools import product, count 

def generate_bytes(): 
    for l in count(1): 
     for sequence in product(range(256), repeat=l): 
      yield bytes(sequence) 

然后遍历是:

for attempt in generate_bytes(): 
    encoded = base64.encodestring(attempt) 
    if binascii.crc32(encoded) == 323322056: 
     print(encoded) 

可能需要等待很长的时间,但是,由于它需要2574816081756422681317790513970423263275217508迭代产生字节串b'supersecretpassword'。大概在那之前有碰撞,但我不会屏住呼吸太久等待一个。

如果你想使用全部是数字,那么就str(i).encode('ascii')是不够的:

from itertools import count 

for attempt in count(): 
    encoded = base64.encodestring(str(attempt).encode('ascii')) 
    if binascii.crc32(encoded) == 323322056: 
     print(encoded) 
+0

为什么元组在这里? – ajkumar25

+0

@ ajkumar25:因为“字节(整数)”将产生一个长度为整数且空值的“字节”对象。 –