17

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

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

しかし、よくわかりません。これを復号化する方法は?

decrypted = decrypt(encrypted)
4

7 に答える 7

25

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

http://en.wikipedia.org/wiki/Cryptographic_hash_function に注意してください:

理想的な暗号化ハッシュ関数には、次の 4 つの主要なプロパティがあります。

    1. 任意のメッセージのハッシュ値を簡単に計算できます
    1. 指定されたハッシュを持つメッセージを生成することは実行不可能です
    1. ハッシュを変更せずにメッセージを変更することは不可能です
    1. 同じハッシュを持つ 2 つの異なるメッセージを見つけることは不可能です。

それを元に戻すことができれば、ルール 2 に違反することになります。これらのルールにより、情報を明らかにすることなく、何らかの情報 (パスワードなど) を持っていることを相手に伝えることができます。たとえば、ウィキペディアを参照してください: 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))

可逆ハッシュ関数が必要な場合は、可逆ハッシュ関数を参照してください

于 2013-04-11T19:15:44.977 に答える
7

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

ハッシング

http://en.wikipedia.org/wiki/Cryptographic_hash_functionを参照してください

注: 特定のハッシュ アルゴリズムを「BREAK」することは可能ですが、これは復号化ではありません。リンクや、python でもサポートされている他のアルゴリズムで詳細情報を見つけることができます。

暗号化

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

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

于 2013-04-11T19:17:14.463 に答える
5

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

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 はハッシュする関数です。

于 2014-01-26T01:30:08.133 に答える
3

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

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

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

于 2013-04-11T19:23:28.663 に答える
0

これは役立つかもしれませんか?

import hashlib

l = ["riyad", "onni", "arman"]

def check_user(h):
    for i in l:
        if h == hashlib.md5(i.encode('utf-8')).hexdigest():
            return i


print(check_user(hashlib.md5(l[2].encode('utf-8')).hexdigest()))
于 2020-10-04T07:10:50.813 に答える