1

我正在编写一个程序,该程序创建随机字符串,然后对字符串进行哈希处理以获取其 MAC。然后我想查看哈希的第一个字节,看看是否等于特定的十六进制值。(简化了图像前攻击。)我的代码成功地从每个哈希中提取了第一个字节,但没有正确比较它。因此,即使两个字节相等,while 循环也无法识别它并无限期地继续运行。

    Random generator = new Random();
    Boolean found = false;
    int i;
    String test="";
    int whatIWant = 169;


    while(found == false)
    {

        String x = "";
        i = 0;

    while(i<15000)
    {   //String x = "";


        int y = generator.nextInt(220)+20;
        x = x + Integer.toHexString(y);
        i++;
    }
    byte[] hexMessage = DatatypeConverter.parseHexBinary(x);
    MessageDigest cript = MessageDigest.getInstance("SHA-512");
    cript.reset();
    cript.update(hexMessage);
    byte[] hash = cript.digest();

    test = String.format("%02X ", hash[0]);

    if(test.equalsIgnoreCase(Integer.toHexString(whatIWant).toString()))
        found = true;
4

2 回答 2

0

我没有运行你的代码。我想看看 Integer.toHexString() 的结果,我不确定你为什么将 Integer.toHexString() 返回的字符串再次称为 .toString() 的字符串,尽管这不是一个大问题,因为值应该相同。

总而言之,我认为突出的问题可能是您从未关闭过您的 while 循环......至少它没有在这里显示。

于 2015-03-25T18:06:38.200 回答
0

您正在字节 ( ) 中搜索hash[0]大于字节最大值 (127) 的值 (169)。这就是您的搜索永远不会完成的原因之一。> 127 的值永远不会存在。

下一个问题是您的字符串转换模式"%02X "在十六进制字符串之后引入了一个空格。假设您搜索 127..."7F "永远不会等于"7F",所以再一次,您的搜索永远不会完成,即使对于范围内的字节值也是如此。

出于兴趣,请尝试将其添加到您的代码中:

循环外:

Set<Integer> foundBytes = new TreeSet<Integer>();

在循环结束时:

if (hash[0] != whatIWant) {
    if (foundBytes.add((int)hash[0])) {
        System.out.printf("[%3d] %s\n", foundBytes.size(), foundBytes);
    }
}

如果您将搜索值设置为大于 127,您会注意到该foundBytes集合很快被所有可能的 byte 值填满,之后不再找到新的字节并且不会调用 print 语句。

(顺便说一句,您的代码可以通过多种方式进行优化,但这不是问题的重点。)

于 2015-03-26T10:17:22.970 回答