2

我有一个 MD5 哈希(例如“5d41402abc4b2a76b9719d911017c592”),我想找到另一个具有相同哈希的字符串。到目前为止,我已经创建了两种算法(一种在 Java 中,另一种在 C# 中),但它们运行速度非常慢。目前我每秒只能处理大约 100,000 个哈希值。我应该使用其他算法来加快速度吗?

这是我目前在 Java 中使用的算法的一个示例(我将原始散列存储在 originalHash 中,然后生成其他字符串的散列,这些字符串只是数字并比较散列):

import java.security.*;
import java.math.*;

public class b {
public static void main(String args[]) throws Exception{
    String s="Hello";
    MessageDigest m=MessageDigest.getInstance("MD5");
    m.update(s.getBytes(),0,s.length());
    String originalHash = new BigInteger(1,m.digest()).toString(16);
    System.out.println("MD5: " + originalHash);

    for (long i = 0; i < 9223372036854775807L; i++)
    {
        String iString = i + "";
        m.update(iString.getBytes(),0,iString.length());
        iString = new BigInteger(1,m.digest()).toString(16);
        if (originalHash.equals(iString))
        {
            System.out.println("Found MD5: " + iString);
            break;
        }
        if (i%1000000 == 0)
        {
            System.out.println("Count: " + (long)i/1000000 + "M");
            System.out.println("Sample Hash: " + iString);
        }
    }
}
}
4

2 回答 2

2

您需要了解一下 GPU 编程。您可以运行数千个线程来一次检查您的哈希值与您的顺序递增数字,GPU 模型非常适合您的问题定义。哈希破解器的一个示例是oclHashCat

否则,您可以将计算分布在多台机器上以并行运行哈希,例如建立一个hadoop集群。

另一种选择是使用彩虹表预先计算所有可能的哈希值,然后进行查找。

当然,您可以为“md5 哈希查找”执行“google”,然后输入您现有的 MD5 哈希并获取字符串结果。

如果您试图在您选择的输入和任何其他值之间找到随机冲突,那么......您可能会稍等片刻。

于 2012-04-28T04:23:36.313 回答
0

当您关注大数字运算和性能(延迟)时,基于堆栈的 VM(如 Java/.Net)并不是一个好的选择。要在 Java 中完成此操作,请在 C++ 中实现算法并通过 Java Native Interface 调用它。在 .Net 世界中,使用不安全代码通过指针访问字节。绝对在这两种情况下,您都必须处理稳定性/内存管理,因为没有平台/框架为您处理它。

于 2012-04-28T04:32:59.020 回答