将两个十六进制值作为字符串进行比较



我正在编写一个程序,该程序创建随机字符串,然后对字符串进行哈希运算以获得其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;

您正在字节(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] %sn", foundBytes.size(), foundBytes);
    }
}

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

(BTW可以通过多种方式优化您的代码,但这不是问题的重点。)

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

总而言之,我认为悬而未决的问题可能是你从未结束你的while循环。。。至少这里没有显示。

相关内容

  • 没有找到相关文章

最新更新