Java SHA-1 хэш неподписанного байта - PullRequest
1 голос
/ 30 января 2012

Hy парни!

У меня следующая проблема: мне нужно хешировать неподписанный байт в Java, который (будет ...) между 0-255.Основная проблема заключается в том, что в java вообще нет типа unsigned Byte.Я нашел обходной путь для этого и использовал int вместо байта с небольшой модификацией.

Основная проблема: функция Java.securitys Messagedigest.digest принимает только типы байтовых массивов, но мне нужно было бы дать еймассив int.

У кого-нибудь есть обходной путь для этого?Я искал стороннюю функцию ша-1, но ничего не нашел.Ни один пример кода.

Так что в основном то, что мне нужно: у меня есть значение беззнакового байта, например: 0xFF и мне нужно получить следующий хэш sha1: 85e53271e14006f0265921d02d4d736cdc580b0b

любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 30 января 2012

Важно понимать, что нет разницы между подписанными и неподписанными байтами в отношении их представления. Подпись - это то, как байты обрабатываются арифметическими операциями (кроме сложения и вычитания, в случае представления дополнения 2).

Итак, если вы используете byte s для хранения данных, все, что вам нужно, это убедиться, что вы обрабатываете их как беззнаковые при преобразовании значений в byte s (используйте явное приведение с (byte), точка 1) и от byte с (запретить расширение знака с помощью & 0xff, точка 2):

public static void main(String[] args) throws Exception {    
    byte[] in = { (byte) 0xff }; // (1)
    byte[] hash = MessageDigest.getInstance("SHA-1").digest(in);
    System.out.println(toHexString(hash));
}

private static String toHexString(byte[] in) {
    StringBuilder out = new StringBuilder(in.length * 2);
    for (byte b: in)
        out.append(String.format("%02X", b & 0xff)); // (2)
    return out.toString();
}
1 голос
/ 30 января 2012

Дайджесту не важно, как Java воспринимает знак байта;это заботится только о битовой структуре байта.Попробуйте это:

MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update((byte) 0xFF);
byte[] result = digest.digest();

StringBuilder buffer = new StringBuilder();
for (byte each : result)
    buffer.append(String.format("%02x", 0xFF & each));
System.out.println(buffer.toString());

Это должно вывести 85e53271e14006f0265921d02d4d736cdc580b0b.

0 голосов
/ 30 января 2012

Посмотрите на Кодек Apache Commons библиотека, метод DigestUtils.sha (Строковые данные) . Это может быть полезно для вас.

...