Функция Java SHA-512, производящая только 508-битный вывод? - PullRequest
2 голосов
/ 21 мая 2019

У меня есть точки данных, которые я перебираю и хэширую. Я использую Java-реализацию SHA-512 для хэширования моих данных. Хеш должен создавать строку из 128 символов, но иногда он создает строку из 127 символов, что приводит к тому, что мой код имеет исключения за пределами границ.

Код обычно создает неправильный хэш длины 1 из каждых 20 различных вычисленных хешей.

Это код, который я использую для реализации хэша, который https://www.geeksforgeeks.org/sha-512-hash-in-java/

public static String SHA512(String input) 
{ 
    try { 
        // getInstance() method is called with algorithm SHA-512 
        MessageDigest md = MessageDigest.getInstance("SHA-512"); 

        // digest() method is called 
        // to calculate message digest of the input string 
        // returned as array of byte 
        byte[] messageDigest = md.digest(input.getBytes()); 

        // Convert byte array into signum representation 
        BigInteger no = new BigInteger(1, messageDigest); 

        // Convert message digest into hex value 
        String hashtext = no.toString(16); 

        // Add preceding 0s to make it 32 bit 
        while (hashtext.length() < 32) { 
            hashtext = "0" + hashtext; 
        } 

        // return the HashText 
        return hashtext; 
    } 

    // For specifying wrong message digest algorithms 
    catch (NoSuchAlgorithmException e) { 
        throw new RuntimeException(e); 
    } 
} 

Вот хэш правильной длины (128 символов), полученный с помощью кода, указанного выше: ca36f8a40a6211d49e77f84ca37182813fba853fba732e29d18414c739b85f856fd3af702a2cd23174eeaedf2d99a044b0ae0ddea17de7bbb33e3b62cfec5236

Вот хэш неправильной длины (127 символов), созданный кодом, указанным выше: d2d3cb7a7f60a0fd673c86fb82eb515c4f2f40f0308df7b3c838b78c510125967191ad9afe0e4f8e5fb59ed190bc6652d3e4805c886fc1e62213a3284cca661

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вы конвертируете свой хеш в шестнадцатеричную строку. Один из шестнадцати хэшей в среднем начинается с двоичного 0b0000, что дает начальный ноль в вашем шестнадцатеричном преобразовании, точно так же, как один из 256 будет начинаться с 0b00000000 или 0x00. Убедитесь, что в вашем гекс-конверсии не удалены начальные нули.

1 голос
/ 21 мая 2019

Изменение условия цикла while с < 32 на < 128 исправляет его.Это имеет смысл, поскольку код должен создавать строку из 16 шестнадцатеричных цифр (512 бит), а не строку из 32 шестнадцатеричных цифр (128 бит).Похоже, что это может быть ошибка, указанная в коде OP.

...