如何加密定义的字符集python中的所有可能的字符串?

时间:2012-11-15 15:56:54

标签: python hash python-3.x

我正在尝试加密已定义字符集中的所有可能字符串,然后将它们与用户输入给出的哈希值进行比较。

这就是我目前所拥有的

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”时遇到了麻烦

感谢任何帮助

4 个答案:

答案 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是盐。