Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有什么简单的方法可以反转这个散列函数吗?_Python_Encryption - Fatal编程技术网

Python 有什么简单的方法可以反转这个散列函数吗?

Python 有什么简单的方法可以反转这个散列函数吗?,python,encryption,Python,Encryption,我有下面的python方法,它得到一个字符串并返回一个整数。我正在寻找正确的输入,它将打印“非常成功!” 你可以试着用暴力强迫它。 只需做一个while循环,其中输入由函数加密,直到得到相同的散列。 但是如果没有输入长度等信息,可能需要一段时间。是的,很容易破解。答案是“O95PIVII” 顺便说一下,示例中的检查无效,您需要从中删除hex,因为文本0xEA9D1ED352B8被解析为int 编辑查看Rawing的评论,了解我是如何得到答案的。更详细一点:因为它的求和幂是42,基于字符串中字符的

我有下面的python方法,它得到一个字符串并返回一个整数。我正在寻找正确的
输入
,它将打印“非常成功!”


你可以试着用暴力强迫它。 只需做一个while循环,其中输入由函数加密,直到得到相同的散列。
但是如果没有输入长度等信息,可能需要一段时间。

是的,很容易破解。答案是“O95PIVII”

顺便说一下,示例中的检查无效,您需要从中删除
hex
,因为文本0xEA9D1ED352B8被解析为int


编辑查看Rawing的评论,了解我是如何得到答案的。更详细一点:因为它的求和幂是42,基于字符串中字符的索引,所以很容易计算出输入字符串所需的长度:
math.ceil(math.log(target)/math.log(42))
,这给了我们9。然后我从字符串的末尾一直到开头,因为最后一个字符对和的影响最大

它将输入编码在base 42中(从
chr(47)
开始,即
'/'
),并且易于解码:

def dec(x):
    while x:
        yield chr(47 + x % 42)
        x //= 42

print ''.join(dec(0xEA9D1ED352B8))

输出为:
?O95PIVII

这不是加密。它更像是一个散列函数,这是完全不同的。散列或任何加密的整体安全性在于它是一个单向函数,这意味着它很容易转换,但在计算上很难从散列中找到原始值。@Tony encryption!=单向函数加密的全部思想是,你可以在以后对它解密以取回原件。与你所描述的hasing相反,一旦你注意到它是42次幂和,就很容易估计输入的长度——42次幂和,直到它们大于预期结果。然后您应该注意到,它将输入的每个字符转换为一个数字并与之相乘。因此,您可以从中计算平均字符值。剩下的只是一点尝试和错误,调整每个字符直到结果正确为止。@IrmendeJong很好的一点,我考虑的是密钥,但加密的结果不是单向的。请参阅我的答案,了解确定所需长度的简单方法。完美,比我手工操作简单得多:)无需这样做,保罗·汉金(Paul Hankin)的回答中给出了一种更简单的“破解”方法。我认为你应该把他的答案标记为真正的解决方案。
>>> enc("?O95PIVII")==0xEA9D1ED352B8

True
def dec(x):
    while x:
        yield chr(47 + x % 42)
        x //= 42

print ''.join(dec(0xEA9D1ED352B8))