C++ 在不使用蛮力的情况下反转SHA-1或MD5给定(小)输入长度

C++ 在不使用蛮力的情况下反转SHA-1或MD5给定(小)输入长度,c++,algorithm,hash,md5,sha,C++,Algorithm,Hash,Md5,Sha,我记得听说SHA-1发现了一些弱点,使得在给定输出哈希的情况下更容易找到明文输入。我还知道,MD5对于某些应用程序来说是很弱的。我正试图创建一个程序来演示两种方法的不同复杂性:使用蛮力搜索来查找输入,以及利用SHA-1或MD5中的弱点来查找输入 明文输入的长度No,这是不可能的。虽然MD5和SHA-1中确实存在一些弱点,但它们通常不允许这种形式的前像攻击——大多数已知弱点涉及冲突对的构造。有关SHA-1漏洞的详细概述,请参阅 对于这样一个小的输入示例,您可以在内存中构建一个包含所有可能输入值及

我记得听说SHA-1发现了一些弱点,使得在给定输出哈希的情况下更容易找到明文输入。我还知道,MD5对于某些应用程序来说是很弱的。我正试图创建一个程序来演示两种方法的不同复杂性:使用蛮力搜索来查找输入,以及利用SHA-1或MD5中的弱点来查找输入


明文输入的长度No,这是不可能的。虽然MD5和SHA-1中确实存在一些弱点,但它们通常不允许这种形式的前像攻击——大多数已知弱点涉及冲突对的构造。

有关SHA-1漏洞的详细概述,请参阅

对于这样一个小的输入示例,您可以在内存中构建一个包含所有可能输入值及其哈希值的彩虹表(以毫秒为单位)。我怀疑你会用剥削和暴力来衡量任何显著的区别


此外,对于如此小的输入范围,冲突极不可能发生(因此几乎肯定不会有冲突对)。

使用[a-Z]字母表可以提供26个可能的字符。所以你有26**4=456976个不同的输入。考虑到即使是基于CPU的破解程序每秒也会执行数百万次哈希运算,尝试任何非暴力的东西都没有意义。@mfontanini我的目的不是创建一种有效的方法来查找前映像,而是演示不同方法之间的差异。蛮力当然是这样一个小例子的理想选择。我很难找到关于如何构造彩虹表的信息,所以也许你可以回答这个问题。我的理解是彩虹表只是一组输入的预计算哈希输出的查找表。如果rainbow表将在执行时生成,并且只用于检查1个密码,那么rainbow表相对于迭代暴力攻击是否有任何好处?(或者它们本质上是一样的?)这不是一种检查一个密码的有用技术,不。@Samthesamich:只查找一个密码是没有好处的。如果您偶尔查找密码,则可以生成并保存彩虹表。手头有它可能比brute强制下一次查找更快。不过,对于如此小的输入范围,我会选择需要最少编码的方法。在运行时几乎不会有什么不同。如果你使用7-8个字符,包括所有字母数字和特殊字符,我的经验是非GPU暴力大约需要一个小时(取决于你的硬件)4应该需要几秒钟。