2014-01-14 43 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:因爲「字節(整數)」將產生一個長度爲整數且空值的「字節」對象。 –