2014-01-14 2 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() 

Полный StackTrace

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() требуется значение bytestring в качестве входного сигнала. Вы хотели бы использовать:

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: Поскольку 'bytes (integer)' будет генерировать объект 'bytes' целого числа length с нулями. –