我正在尝试加密已定义字符集中的所有可能字符串,然后将它们与用户输入给出的哈希值进行比较。
这就是我目前所拥有的
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”时遇到了麻烦
感谢任何帮助
答案 0 :(得分:0)
嗯可能更好用bcrypt? https://github.com/fwenzel/python-bcrypt
答案 1 :(得分:0)
以下是一个简单的程序,可以满足您的要求:
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生成器从固定长度的字符集生成单词。您可以将加密函数替换为您想要的任何内容(在示例中,字符串反转用作哈希)。
请注意,使用实际的现代哈希方法,解密普通密码需要永远,所以我认为你实际上并不能使用它。
答案 2 :(得分:0)
这是我完全不同的答案,基于J.F. Sebastian的answer并对我以前的答案发表评论。最重要的一点是crypt.METHOD_CRYPT
不是可调用的,即使文档有点令人困惑地调用hashing method,就好像它是模块或实例的方法函数一样。它不是 - 只需将其视为crypt
模块支持的各种加密之一的id或名称。
所以你的代码问题是双重的:一个是你试图使用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)
答案 3 :(得分:0)
crypt.METHOD_CRYPT
不可调用,因此您提供的回溯与问题中的代码不对应。 crypt.METHOD_CRYPT
可以用作crypt.crypt()
function的第二个参数。
同样,@martineau指出wordchars
是一个元组,但您需要一个字符串传递给crypt.crypt()
函数。
来自the docs:
由于一些crypt(3)扩展允许不同的值,具有不同的值 盐中的大小,建议使用完整的密码 在检查密码时作为盐。
要找到定义字符集中的纯文本,给定其加密形式:salt plus hash,您可以:
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)
断言行确保使用单词crypt
和salt e2e4
调用qb
会产生qb1Y.qWr.DHs6
,其中qb
是盐。