Сравнение двух шестнадцатеричных значений в виде строк

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;
Теги:
hmac
hex
javax.crypto
sha512

2 ответа

0
Лучший ответ

Вы просматриваете байты (hash[0]) для значения (169), превышающего максимальное значение байта (127). Это одна из причин, по которой ваш поиск никогда не заканчивается. Значений> 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 быстро заполнит все возможные значения байта, после чего не будет найдено больше новых байтов, и оператор печати не будет вызван.

(Ваш код может быть оптимизирован несколькими способами BTW, но это не вопрос.)

  • 0
    Оказывается, единственная проблема заключалась в том, что мое преобразование String добавило дополнительный пробел к «% 02X». Значением поиска было десятичное число, которое было преобразовано в шестнадцатеричное. Поэтому, когда мой оператор if проверял, равны ли значения, он проверял, было ли шестнадцатеричное значение A9 равным первому шестнадцатеричному значению в байте [].
0

Я не запускал ваш код. Я хотел бы увидеть результат Integer.toHexString(), и я не уверен, почему вы вызываете строку, возвращаемую Integer.toHexString(), чтобы снова быть строкой с помощью.toString(), хотя это не большая проблема, поскольку значение должно быть одинаковым.

В целом, я думаю, что выдающаяся проблема заключается в том, что вы никогда не закрывали цикл while... по крайней мере, здесь не показано.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню