web-dev-qa-db-ja.com

Pythonでhashlibを使用して復号化するにはどうすればよいですか?

私は暗号化する方法を知っています:

encrypted = hashlib.sha256('1234').hexdigest()

これを解読する方法がわかりませんか?

decrypted = decrypt(encrypted)
12
Kamilski81

Sha256のようなハッシュのポイントは、一方向関数であることが想定されていることです(ただし、真の一方向関数の存在は未解決の問題ですが、 http://en.wikipedia.org/wiki/)を参照してください)一方向関数 )。

http://en.wikipedia.org/wiki/Cryptographic_hash_function

The ideal cryptographic hash function has four main properties:

    1. it is easy to compute the hash value for any given message
    2. it is infeasible to generate a message that has a given hash
    3. it is infeasible to modify a message without changing the hash
    4. it is infeasible to find two different messages with the same hash.

これを元に戻すことができれば、ルール2に違反することになります。これらのルールにより、情報を明かすことなく、ある情報(パスワードなど)を他の当事者に知らせることができます。たとえば、wikipediaを参照してください: http://en.wikipedia.org/wiki/Cryptographic_hash_function#Illustration

可逆性が必要な場合は パスワードに従って文字列をエンコードする簡単な方法? を参照してください。Vignereなどの弱いものを使用できますが、PyCryptoを使用した例もあります。

from Crypto.Cipher import AES
import base64

cipher = AES.new(secret_key,AES.MODE_ECB) # never use ECB in strong systems obviously
encoded = base64.b64encode(cipher.encrypt(msg_text))
# ...
decoded = cipher.decrypt(baes64.b64decode(msg_text))

リバーシブルハッシュ関数が必要な場合は、 リバーシブルハッシュ関数? を参照してください。

20
Anil Vaitla

簡単に言えば、ハッシュを「復号化」することはできません。これは一方向の関数です。暗号化とハッシュには大きな違いがあります。

ハッシュ

参照 http://en.wikipedia.org/wiki/Cryptographic_hash_function

注:特定のハッシュアルゴリズムを「BREAK」することは可能ですが、これは復号化ではありません。あなたはリンクやPythonでサポートされている他のアルゴリズムでより多くの情報を見つけるでしょう

暗号化

および http://en.wikipedia.org/wiki/Encryption

ハッシュの便利な例はパスワードをデータベースに保存することですが、暗号化の便利な例は銀行の詳細をオンラインストアに送信して何かを購入することです。

5
chrisw

ハッシュは一方向関数を使用して計算されます。つまり、特定の入力に対して同じ出力が得られますが、それは一方向関数にすぎないため、何をしても解読できません。力ずくで解読してみてください。つまり、辞書から単語のハッシュを計算し、解読したいハッシュと比較します。辞書の単語のハッシュを計算する時間を節約するために、単語のハッシュを含むレインボーテーブルがオンラインで利用可能です。

読む: http://en.wikipedia.org/wiki/Rainbow_table

ハッシュのブルートフォース復号化のためにオンラインサービスを使用することもできます。十分な数があり、解読したいWordが辞書に属している場合にうまく機能します。

1
scottydelta

それほど正確ではない分析:暗号化は、変装した誰かのようなものです...ハッシュを取得することは、指紋を取得するようなものです!

変装を削除または取り消すことで「元の」人物を取り戻すことができますが、指紋のセットからそれを行うことはできません。

1
MikeW

これは有効な質問ですが、正しく提言されていない可能性があります。

OP、あなたがしようとしていることは、ハッシュされていない値に対してハッシュされた値をチェックすることだと思いますか?

hashed = hashlib.sha256('1234').hexdigest()
hashedstring = '1234' + ',' + hashed

次に、ハッシュされた==元の値を確認します。したがって、コンマの前後の部分を解析します。 1234をハッシュし、ハッシュされた値と比較します。

def check_secure_val(h):
    commapos = h.find(",")
    val = h[0:commapos]
    hashval = h[commapos+1:-1]
    rehashval = hash_str(val)
    if rehashval == hashval:
        return val

ここで、入力hは「val、(HASHEDSTRING)」形式の文字列です。

そしてhash_strはハッシュする関数です。

1