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

理想的密码散列函数有四个主要属性:

    1. 很容易计算任何给定消息的哈希值
    1. 生成具有给定哈希的消息是不可行的
    1. 在不更改哈希的情况下修改消息是不可行的
    1. 找到具有相同哈希的两条不同消息是不可行的。

如果你能扭转它,那么你就违反了规则 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

注意:可以“中断”某些哈希算法,但这不是解密。您将在链接中找到更多信息以及 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 回答
4

不太准确的类比:加密就像一个伪装的人......取一个哈希就像取他们的指纹!

您可以通过移除/反转伪装来找回“原始”人,但您不能从一组指纹中做到这一点!

于 2017-08-31T10:05:54.607 回答
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 回答
0

我认为您无法解密它,但您可以做的可能是将猜测的密码范围例如放在 for 循环中,然后将它们全部放入“{password:hashed password”然后检查哈希值,也许您会得到它

所以假设你想破解一个 CSV 文件中的密码,并且在 0000-9999 之间

输入 csv 文件将如下所示:

名称,哈希密码

首先我们将导入 csv 和 hashlib

import hashlib
import csv

现在让我们编写一个函数,将散列的 csv 文件和输出 csv 文件作为参数,我们将创建一个空字符串和一个空字典

def decryptor(input_file_name,output_file_name):
    # makes hashes
    clear_text = ""
    mydict = {}

现在让我们在 0 和 9999 范围内创建一个 for 循环,我们将加密该范围内的每个数字

    for i in range(0, 10000):
        i = str(i).encode('utf-8') 
        encrypted = hashlib.sha256(i).hexdigest()
        mydict[i] = encrypted

现在我们将它们写在 csv 文件中

    with open(input_file_name, 'r') as hash_file:
        # read's from csv file
        reader = csv.reader(hash_file)
        hash_dict = {}
        # reades every line of csv file
        for row in reader:
                hash_dict[row[0]] = row[1]

现在我们只需要使用我们已经拥有的哈希检查我们想要解密的哈希,我们将获得未哈希的密码

    check_hash = []
    for i in list(mydict):
        text = "%s" % (mydict[i])
        check_hash.append(mydict[i])
    for i in list(hash_dict):
        if hash_dict[i] in check_hash:
            hashes = list(mydict.keys())[list(mydict.values()).index(hash_dict[i])]
            names = list(hash_dict.keys())[list(hash_dict.values()).index(hash_dict[i])],
            text = "%s,%s\n" % (names[0], hashes.decode('utf-8'))
            clear_text += text

现在我们将输出写入输出 csv 文件

    with open(output_file_name, 'w') as passwords:
        passwords.write(clear_text)

我们只需调用该函数

decryptor(<INPUT CSV>, <OUTPUT CSV NAME>)

这是我对你的想法,当然你不能使用这个这是一个想法,希望它会有所帮助:)

于 2022-02-19T06:57:15.517 回答