Java MessageDigest MD5 не возвращает ожидаемый результат

Мне стало очень скучно, поэтому я делаю экспериментальный Brute Forcer. Однако у меня есть некоторые проблемы с MD5. Я получаю два очень разных результата,

1aabac6d068eef6a7bad3fdf50a05cc8
-7d881f6ef28afe6a4bb78689e91f6e53

Первый действителен и равен dd, второй недействителен, даже если я уберу начальный дефис.

Я просматривал этот ответ и скорректировал то, что у меня было, на то, что решило мою основную проблему, однако я все еще становлюсь недействительным MD5s.

Мой код:

public boolean testValidity(String s) {
    try {
        MessageDigest md = MessageDigest.getInstance(name());
        byte[] hashDigest = md.digest(s.getBytes("UTF-8"));
        String hash = String.format("%032x", new BigInteger(md.digest(s.getBytes("UTF-8"))));
        System.out.println(hash);
        return getCompare().equalsIgnoreCase(hash);
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException | NullPointerException e) {
        e.printStackTrace();
        return false;
    }
}

В приведенном выше примере name() просто получает "MD5", а getCompare() получает хэш для сравнения.

Мой вопрос: как я могу исправить свой код, чтобы убедиться, что все MD5 действительны?


person Spedwards    schedule 14.07.2015    source источник


Ответы (1)


Ваш конструктор BigInteger использует дополнение до двух. Вместо этого используйте вариант знак/величина с первым параметром 1. http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#BigInteger(int,%20byte[])

person Drunix    schedule 14.07.2015