¿Cómo cifrar todas las cadenas posibles en un conjunto de caracteres definido python?

Estoy tratando de cifrar todas las cadenas posibles en un conjunto de caracteres definido y luego compararlas con un hash dado por la entrada del usuario.

Esto es lo que tengo actualmente

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) 

Obviamente no se ha terminado todavía, pero estoy teniendo problemas para cifrar “wordchars”

Cualquier ayuda es apreciada

crypt.METHOD_CRYPT no se puede crypt.METHOD_CRYPT lo que el rastreo que usted proporcionó no corresponde al código de su pregunta. crypt.METHOD_CRYPT podría usarse como el segundo parámetro para la función crypt.crypt() .

También, como @martineau señaló, las wordchars es una tupla, pero se necesita una cadena para pasar a la función crypt.crypt() .

De los documentos :

Como algunas extensiones de crypt (3) permiten diferentes valores, con diferentes tamaños en el salt, se recomienda usar la contraseña completa encriptada como salt cuando se busca una contraseña.

Para encontrar un texto sin formato de un conjunto de caracteres definido dada su forma encriptada: sal más hash, podría:

 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 

Ejemplo

 salt, hashed = 'qb', '1Y.qWr.DHs6' print(decrypt(salt + hashed)) # -> e2e4 assert crypt('e2e4', 'qb') == (salt + hashed) 

La línea de e2e4 asegura de que llamar a crypt con la palabra e2e4 y la sal qb produzca qb1Y.qWr.DHs6 donde qb es la sal.

Hmm puede ser mejor usar bcrypt? https://github.com/fwenzel/python-bcrypt

A continuación hay un progtwig simple que hace lo que pediste:

 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 

Básicamente, utiliza un generador de python para generar palabras del conjunto de caracteres de longitud fija. Puede reemplazar la función de cifrado con lo que desee (en el ejemplo, la inversión de cadena se utiliza como hash).

Tenga en cuenta que con los métodos de hashing modernos reales, tomará una eternidad descifrar una contraseña normal, por lo que no creo que realmente pueda usar esto.

Aquí está mi respuesta completamente diferente basada en la respuesta de JF Sebastian y el comentario sobre mi respuesta anterior. El punto más importante es que crypt.METHOD_CRYPT no es llamable aunque la documentación llame un método de hashing de forma confusa como si fuera una función de método de un módulo o una instancia. No lo es, solo piénselo como un id o nombre de uno de los varios tipos de cifrado admitidos por el módulo crypt .

Entonces, el problema con su código es doble: uno es que estaba tratando de usar wordchars como una cadena, cuando en realidad era una tupla producida por el product() y segundo, que está tratando de llamar a la ID crypt.METHOD_CRYPT .

Tengo una pequeña desventaja al responder esto porque no estoy ejecutando Unix, no tengo instalado Python v3.3 y no entiendo completamente lo que estás tratando de lograr con tu código. Dadas todas esas advertencias, creo que algo como lo siguiente que se deriva de su código debería al menos ejecutarse:

 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)