Java SHA-1 хэш неподписанного байта

Привет, ребята!

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

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

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

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

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

3 ответа

Решение

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

Итак, если вы используете byteДля хранения данных все, что вам нужно, это убедиться, что вы обращаетесь с ними как без знака при преобразовании значений в bytes (используйте явное приведение с (byte), пункт 1) и из bytes (предотвратить расширение знака с помощью & 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();
}

Дайджест не будет заботиться о том, как 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,

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

Другие вопросы по тегам