Как зашифровать все возможные строки в определенном наборе символов Python?

Я пытаюсь зашифровать все возможные строки в определенном наборе символов, а затем сравнить их с хешем, данным пользовательским вводом.

Это то, что у меня сейчас есть

import string
from itertools import product
import crypt

def decrypt():
    hash1 = input("Please enter the hash: ")
    salt = input("Please enter the salt: ")
    charSet = string.ascii_letters + string.digits
    for wordchars in product(charSet, repeat=2):
        hash2 = crypt.METHOD_CRYPT((wordchars), (salt))
        print (hash2)

Очевидно, он еще не закончен, но у меня проблемы с шифрованием "wordchars»

Любая помощь приветствуется

 user181646715 нояб. 2012 г., 19:01
Проблема в том, что это не работает.
 martineau15 нояб. 2012 г., 19:04
Я имел в виду, в каком смысле это не работает?
 martineau15 нояб. 2012 г., 17:49
Какие'твой "беда"? В противном случае это неэто настоящий вопрос.
 jfs16 нояб. 2012 г., 03:14
вы могли быредактировать ваш вопрос и положите туда правильно отформатированную трассировку
 user181646715 нояб. 2012 г., 19:18
я получаю это сообщение об ошибкеTraceback (most recent call last): File "", line 1, in File "", line 4, in decrypt TypeError: must be string, not tuple

Ответы на вопрос(4)

Это мой совершенно другой ответ, основанный на Дж. Ф. Себастьянеответ и прокомментируйте мой предыдущий ответ. Наиболее важным моментом является то, чтоcrypt.METHOD_CRYPT не вызывается, даже если документация несколько сбивает с толкуметод хеширования как если бы это была метод-функция модуля или экземпляра. Это'это не так - просто думайте об этом как об идентификаторе или имени одного из различных видов шифрования, поддерживаемыхcrypt модуль.

Таким образом, проблема с вашим кодом состоит из двух частей: во-первых, вы пытались использоватьwordchars как строка, когда это на самом деле кортеж, созданныйproduct() а во-вторых, что тыпытаюсь позвонить на номер.crypt.METHOD_CRYPT

м в некотором затруднении, отвечая на это, потому что яUnix не работаетне установлен Python v3.3, и нене совсем понимаю, что тыпытаемся сделать это с помощью вашего кода. Учитывая все эти предостережения,Я думаю что-то вроде следующего, которое является производным от вашего кода, должно по крайней мере выполнить:

import string
from itertools import product
import crypt

def decrypt():
    hash1 = input("Please enter the hash: ")
    salt = input("Please enter the salt: ")
    charSet = string.ascii_letters + string.digits
    for wordchars in product(charSet, repeat=2):
        hash2 = crypt.crypt(''.join(wordchars), salt=salt)  # or salt=crypt.METHOD_CRYPT
        print(hash2)
 jfs16 нояб. 2012 г., 03:18
METHOD_CRYPT не вызывается. Увидетьмой ответ
Решение Вопроса

crypt.METHOD_CRYPT не вызывается, поэтому предоставленная вами трассировкане соответствует коду в вашем вопросе.crypt.METHOD_CRYPT может быть использован в качестве второго параметра дляcrypt.crypt() функция.

Также как@martineau указалwordchars это кортеж, но вам нужна строка для передачиcrypt.crypt() функция.

Отдокументы:

Поскольку несколько расширений crypt (3) допускают разные значения с разными размерами в соли, при проверке пароля рекомендуется использовать полный зашифрованный пароль в качестве соли.

Чтобы найти простой текст из определенного набора символов в зашифрованной форме: соль плюс хеш, вы можете:

from crypt import crypt
from itertools import product
from string import ascii_letters, digits

def decrypt(crypted, charset=ascii_letters + digits):
    # find hash for all 4-char strings from the charset
    # and compare with the given hash
    for candidate in map(''.join, product(charset, repeat=4)):
        if crypted == crypt(candidate, crypted):
            return candidate
пример
salt, hashed = 'qb', '1Y.qWr.DHs6'
print(decrypt(salt + hashed))
# -> e2e4
assert crypt('e2e4', 'qb') == (salt + hashed)

Строка assert гарантирует, что вызовcrypt со словомe2e4 и сольqb производитqb1Y.qWr.DHs6 гдеqb это соль.

 jfs20 нояб. 2012 г., 23:15
@ LWH91: нет. Я имел ввиду вызов функцииcrypt с заданными параметрами и проверить возвращаемое значение
 user181646721 нояб. 2012 г., 16:08
Я выполнял код около 8 часов, пытаясь взломать хэш месяца, но это не удалось сделать. Как долго ждать?
 user181646720 нояб. 2012 г., 23:20
Я получаю другой хэш в качестве возвращаемого значения, он возвращаетaaXPqJ3632ccs', Значит ли это, что я не могу использовать ваш ответ?
 jfs21 нояб. 2012 г., 21:29
@ LWH91: на моей машине это займет 18 минут.Обновите свой вопрос или жеопубликовать новый с минимальным полным примером кода, который воспроизводит вашу проблему
 jfs20 нояб. 2012 г., 23:06
@ LWH91: бегиcrypt("moth", "aa") и посмотрим, что он вернет. Я'Мы обновили ответ, чтобы описать утверждение.
 user181646720 нояб. 2012 г., 22:42
Привет еще раз, ваше решение отлично работает для хэша, который вы дали, но когда я пробую любой хэш, у меня не получается его взломать. Все мои хэши в этом формате: aaacT.VSMxhms. Правильно ли я считаю, что соль "аа» и хешированная строкаacT.VSMxhms», Я знаю что это хеш это словомоль», Какой формат хеширования вы использовали в своем примере, и что делает строка assert?
 user181646722 нояб. 2012 г., 14:06
что вы имеете в виду минимальный полный код?
 user181646716 нояб. 2012 г., 13:56
Блестяще, это работает, большое спасибо. Еще одна маленькая вещь, есть способ, которым я могу установить "повторение" бит для поиска диапазона, поэтому он находит хэш для строк символов, например, от 1 до 10
 jfs16 нояб. 2012 г., 14:13
@ LWH91: примечание: дляrepeat=10 это заняло бы около века, еслиrepeat=4 выполняется за секунду. В противном случае этоitertools.chain.from_iterable(product(charset, repeat=r) for r in range(8)) для случая 0-7.
 user181646722 нояб. 2012 г., 16:05
Сейчас я запускаю код на правильной машине, а не на виртуальной, как я делал раньше, и кажется, что она работает лучше, просто еще одна вещь, если курсор перестает мигать, означает ли это, что программа вылетела или все еще в порядке?
 jfs22 нояб. 2012 г., 14:18
@ LWH91:sscce.org В вашем случае проверьте, что это работает для'moth' и нене дает никакого результата для'month' через час.
 user181646720 нояб. 2012 г., 23:10
что просто запустить в терминале? спасибо за прояснение линии утверждения

def gen_word(charset, L):
    if L == 1: 
        for char in charset:
            yield char
        raise StopIteration
    for char in charset:
        for word in gen_word(charset, L - 1):
            yield char + word


def encrypt(word):
    '''Your encrypt function, replace with what you wish'''
    return word[::-1]


charset = ['1', '2', '3']


user_word = '12'
user_hash = encrypt(user_word)
max_length = 3


for length in range(1, max_length):
    for word in gen_word(charset, length):
        if encrypt(word) == user_hash:
            print 'Word found: %s' % word

По сути, он использует генератор python для генерации слов из набора символов фиксированной длины. Вы можете заменить функцию шифрования чем угодно (в данном примере в качестве хэша используется обращение строки).

Обратите внимание, что с современными методами хешированияпонадобится вечность, чтобы расшифровать обычный пароль, поэтому я неЯ думаю, что вы могли бы на самом деле использовать это.

 user181646715 нояб. 2012 г., 19:02
Можете ли вы объяснить, как это работает, пожалуйста?

Ваш ответ на вопрос