2

我用 Python 编写了一个加密程序,我的选择之一是 md5 加密。当我通过我的 md5 加密运行已知字符串时,我会收到不同的哈希值,然后如果我通过 md5 加密网站或 cryptofox for firefox 运行完全相同的字符串。

例如。我的程序哈希输出 - fe9c25d61e56054ea87703e30c672d91- 明文:g4m3

例如。在线哈希/cryptofox - 26e4477a0fa9cb24675379331dba9c84- 明文:g4m3

完全相同的单词,2 个不同的哈希值。现在继承我的代码片段:

word="g4m3"
string=md5.new(word).hexdigest()
print string
4

2 回答 2

3

至于你的问题:散列非常敏感。即使是一个不同的字符也可能导致完全不同的输出字符串。在线实现可能会附加一个空白字符,或者更可能是一个换行符。这个额外的字符将改变算法的输出。(也有可能发生相反的情况:您正在添加一个换行符而在线没有)

至于 MD5“加密”: MD5不是加密。它是散列。加密接收数据和密钥,并输出随机数据。该数据是可恢复的。另一方面,散列接收数据并吐出代表原始数据的有限数量的数据。但是,除非存储在其他地方,否则原始数据会丢失。

更多信息供参考:另一个有趣的区别是各种算法吐出的数据。加密可以接收任意数量的数据(当然是在操作系统/软件的范围内),并会输出一堆数据 appx。大小与输入数据相等。然而,散列不会。由于它只是数据的表示,因此它的输出有限。这可能会带来问题。例如,如果您有无限量的数据,最终,两个完全不同的数据将具有相同的哈希值。因此,在使用散列比较两个不同的值时,最好同时比较两个单独的散列。两个独立的数据具有两个相等的哈希值的统计概率是天文数字的低。

当然,然后你会进入以加密方法为核心的散列算法,但我不会在这里讨论。

于 2013-07-22T19:16:56.453 回答
3

您在 MD5 输入字符串中包含了换行符:

>>> import md5
>>> word="g4m3"
>>> md5.new(word).hexdigest()        # no newline
'26e4477a0fa9cb24675379331dba9c84'
>>> md5.new(word + '\n').hexdigest() # with a newline
'fe9c25d61e56054ea87703e30c672d91'

从文件中读取数据时,请确保删除行尾的换行符。您可以使用.rstrip('\n')仅从行尾删除行分隔符,或用于从行首或行尾.strip()删除所有空格:

>>> word = 'g4m3\n'
>>> md5.new(word).hexdigest()
'fe9c25d61e56054ea87703e30c672d91'
>>> word = word.strip()
>>> md5.new(word).hexdigest()
'26e4477a0fa9cb24675379331dba9c84'
于 2013-07-22T19:18:45.213 回答