0

定義された文字セット内のすべての可能な文字列を暗号化してから、ユーザー入力によって指定されたハッシュと比較しようとしています。

これは私が現在持っているものです

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

4 に答える 4

0

crypt.METHOD_CRYPTは呼び出し可能ではないため、指定したトレースバックは質問のコードに対応していません。関数crypt.METHOD_CRYPTの2番目のパラメーターとして使用できます。crypt.crypt()

また、@ martineauが指摘したように、タプルですが、関数wordcharsに渡すには文字列が必要です。crypt.crypt()

ドキュメントから:

いくつかのcrypt(3)拡張機能では、ソルトのサイズが異なるさまざまな値が許可されるため、パスワードをチェックするときは、完全に暗号化されたパスワードをソルトとして使用することをお勧めします。

暗号化された形式(saltと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)

アサート行は、単語とソルトを使用して呼び出すとcrypte2e4ソルトがどこにあるかを確認します。qbqb1Y.qWr.DHs6qb

于 2012-11-16T02:09:21.890 に答える
0

うーん、bcryptを使うほうがいいかもしれませんか? https://github.com/fwenzel/python-bcrypt

于 2012-11-15T16:51:06.723 に答える
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ジェネレーターを使用します。暗号化関数は任意のものに置き換えることができます(この例では、ハッシュとして使用される文字列の反転です)。

実際の最新のハッシュ方式では、通常のパスワードを復号化するのに永遠に時間がかかるため、実際にこれを使用できるとは思わないことに注意してください。

于 2012-11-15T17:18:35.157 に答える
0

これは、JFセバスティアンの回答と、以前の回答に関するコメントに基づいた、まったく異なる回答です。最も重要な点は、ドキュメントがモジュールまたはインスタンスのメソッド関数であるかのようにハッシュメソッドcrypt.METHOD_CRYPTをやや紛らわしく呼び出しているにもかかわらず、呼び出し可能ではないということです。それはそうではありません-モジュールによってサポートされているさまざまな種類の暗号化の1つのIDまたは名前と考えてください。crypt

したがって、コードの問題は2つあります。1つはwordchars文字列として使用しようとしていたことです。2つ目は、実際にはによって生成されたタプルでproduct()あり、2つ目はidを呼び出そうとしていることです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)
于 2012-11-15T18:54:49.407 に答える