如何在 Java 或 C# 中创建快速的 MD5 算法

本文关键字:MD5 算法 创建 Java | 更新日期: 2023-09-27 18:32:35

我有一个 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);
        }
    }
}
}

如何在 Java 或 C# 中创建快速的 MD5 算法

你需要看看GPU编程。 您可以运行数千个线程,一次根据顺序递增的数字检查哈希,GPU 模型非常适合您的问题定义。 哈希破解程序的一个例子是oclHashCat。

否则,您可以将计算分布在多台机器上以并行运行哈希,例如启动Hadoop集群。

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

当然,您可以为"md5哈希查找"执行"google",只需输入现有的MD5哈希即可获得字符串结果。

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

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