Encryption 从MD5哈希函数的特殊应用中恢复电子邮件地址

Encryption 从MD5哈希函数的特殊应用中恢复电子邮件地址,encryption,hash,md5,Encryption,Hash,Md5,首先,我们将电子邮件地址分为两个字符串。 然后,对于每个段s,我们计算以下散列J: md5(md5(s) + s + md5(s)) [where + is the string concatenation operator]. 最后,我们连接所有散列字符串J以形成下面的长散列 例如:对于helloworld@company.com,我们将计算: md5(md5('he') + 'he' + md5('he')) + md5(md5('ll') + 'll' + md5('ll')) + m

首先,我们将电子邮件地址分为两个字符串。
然后,对于每个段
s
,我们计算以下散列J:

md5(md5(s) + s + md5(s))  [where + is the string concatenation operator].
最后,我们连接所有散列字符串J以形成下面的长散列

例如:对于
helloworld@company.com
,我们将计算:

md5(md5('he') + 'he' + md5('he')) +
md5(md5('ll') + 'll' + md5('ll')) +
md5(md5('ow') + 'ow' + md5('ow')) +
...
长哈希:

f894e71e1551d1833a977df952d0cc9de44a1f9669fbf97d51309a2c6574d5eaa746cdeb9ee1a5df
c771d280d33e5672bf024973657c99bf80cb242d493d5bacc771b3b0b422d5c13595cf3e73cfb1df
91caedee7a6c5f3ce2c283564a39c52d3306d60cbc0e3e33d7ed01e780acb1ccd9174cfea4704eb2
33b0f06e52f6d5aba5a5a89e6122dd55f8efcf024961c1003d116007775d60a0d5781d2e35d747b5
dece2e0e3d79d272e40c8c66555f5525
如何从哈希中恢复电子邮件地址?据我所知,“散列”是一个单向函数。我只能将其与另一个散列进行比较,看看它们是否匹配或生成原始文本的散列。

虽然从散列中提取原始消息通常是不现实的,但这显然看起来像是一个练习,精心设计了条件,使其有可能破坏“加密”


考虑将电子邮件地址分成两个字符段。如果您将自己限制为仅使用小写字母(26个字母+2个符号,
@
),则只有
28*28=784
可能的两个字母组合。即使电子邮件包含小写和大写字母和数字,也只有
64*64=4096
组合,这在计算范围内

要做的事情是预先计算搜索空间中所有可能哈希值的一个或一个表。您可以使用矩阵:

 +----------------------------------+----------------------------------+----------------------------------------+-----------------------------+
 |                a                 |                b                 |                c                       |             ...             |
 +----------------------------------+----------------------------------+----------------------------------------+-----------------------------+
a| md5(md5('aa') + 'aa' + m5('aa')) | md5(md5('ba') + 'ba' + m5('ba')) | md5(md5('ca') + 'ca' + m5('ca'))       |             ...             |
 +----------------------------------+----------------------------------+----------------------------------------+-----------------------------+
b| md5(md5('ab') + 'ab' + m5('ab')) | md5(md5('bb') + 'bb' + m5('bb')) | md5(md5('cb') + 'cb' + m5('cb'))       |             ...             |
 +----------------------------------+----------------------------------+----------------------------------------+-----------------------------+
c| md5(md5('ac') + 'ac' + m5('ac')) | md5(md5('bc') + 'bc' + m5('bc')) | md5(md5('cc') + 'cc' + m5('cc'))       |             ...             |
 +----------------------------------+----------------------------------+----------------------------------------+-----------------------------+
 |               ...                |               ...                |               ...                      |             ...             |
 +----------------------------------+----------------------------------+----------------------------------------+-----------------------------+
但是,每次你都必须遍历矩阵才能找到匹配项——慢

另一种方法是使用字典,其中键为散列,值为“解码”字母:

{ 
   md5(md5('aa') + 'aa' + md5('aa')): 'aa',
   md5(md5('ab') + 'ab' + md5('ab')): 'ab',
   md5(md5('ac') + 'ac' + md5('ac')): 'ac',
  ...
}
无论哪种方式,您现在都将拥有所有可能的两个字母组合的哈希。现在您处理输入字符串。由于MD5生成32个字符长的哈希,请将输入拆分为32个字符的字符串,并对表执行查找:

'f894e71e1551d1833a977df952d0cc9d' => 'he'
'e44a1f9669fbf97d51309a2c6574d5ea' => 'll'
...

以下是您可以做的:

步骤1:将哈希字符串划分为32位块

步骤2:从字符串列表中找到2个字符串的所有可能组合,可以是字母、数字和任何特殊字符的组合

步骤3:为该段生成MD5哈希代码,将其与纯文本段和相同的哈希代码连接,然后再次生成MD5哈希代码


步骤4:将生成的哈希代码与现有的哈希代码进行比较。如果匹配,请将其保存在字符串缓冲区中。重复此过程,直到所有的块都被解码。您将得到您的答案。

实际上,还不错。这是可能的,除非您遇到冲突,在这种情况下,您需要查看数据并进行一些猜测。冲突从预先计算的数据集中可以明显看出。尽管如此,这不是一项琐碎的任务,因为你的假设是,电子邮件将只包含字母-电子邮件可以包含更多的符号-数字、下划线、加号,可能还有更多我不知道的符号。即使如此,也没有什么可以阻止电子邮件包含大写字母-有可能输入的用户NameLastname@mail.com,系统只是照原样对其进行哈希运算。基本上,如果你没有关于数据集的更多信息,你基本上会被暴力强迫。否则你仍然会这样做,但搜索空间更有限。然而,我直到现在才注意到的一件事是ng hash实际上会给出一封电子邮件的长度。此外,由于您可以预期许多电子邮件会以.com或.co.uk或.de等常见顶级域结尾,因此在许多情况下,您可以切掉最后的2-3个加密组(4-6个字符),因为它们是相同的。事实上,电子邮件域是另一个罪魁祸首(字符用尽)@Vld是的,可以找到冲突,一个所有可能的打印出来,仍然只剩下一小部分可能的电子邮件。至于暴力强迫:在这种情况下,所需的力量根本没有那么大。即使你可以在一封电子邮件中有100个可能的字符,问题的设置方式,你仍然只需要在查找t中输入10000个条目able——最坏情况下,几秒钟就可以了。因此,例如,
@gmail.com
会在任何电子邮件中对@符号前的偶数个符号进行加密。如果数字是奇数,那么
gmail.com
将是一个可识别的字符串。与
@yahoo.com
@hotmail.com
等相同-获取常见邮件列表ders将大幅减少需要破解的电子邮件数量。假设您有一个需要破解的电子邮件的大列表。如果是一个列表,那么您至少应该限制选择。@Vld不限于电子邮件?256个ascii字符在表中仍然只有65536行。与rainbow表m相比,这是微不足道的任何千兆字节的大小都可以用来破坏散列。这是一个更难的问题。这一个设置是可行的。谢谢@helper。这正是我想要的。如果它确实有效,将返回。