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

时间:2015-03-25 17:22:20

标签: java hex hmac sha512 javax.crypto

我正在编写一个创建随机字符串的程序,然后散列字符串以获取其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;

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您正在通过字节(hash[0])搜索大于字节最大值(127)的值(169)。这是您的搜索永远不会完成的一个原因。值&gt; 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集快速填满所有可能的字节值,之后不再找到新字节且print语句不是调用

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