Проблема шестнадцатеричного представления
Если я хочу следующий результат:
RIPEMD-160("The quick brown fox jumps over the lazy dog") =
37f332f68db77bd9d7edd4969571ad671cf9dd3b
Я попробовал это:
string hash11 = System.Text.Encoding.ASCII.GetString(RIPEMD.ComputeHash(Encoding.ASCII.GetBytes("The quick brown fox jumps over the lazy dog")));
но это не дает мне предыдущий результат!
2 ответа
Решение
Функция ComputeHash предоставляет вам байтовый массив со значениями в нем (0x37, 0xF3, ...). Если вы используете GetString, он будет принимать каждое значение в байте и использовать символ с этим значением, он не будет преобразовывать значение в строку.
Вы можете преобразовать это так:
var bytes = RIPEMD.ComputeHash(Encoding.ASCII.GetBytes("The quick brown fox jumps over the lazy dog"));
string hash11 = "";
foreach(var curByte in bytes)
hash11 = curByte.ToString("X2") + hash11; // or curByte.ToString("X") if for example 9 should not get 09
Например, у вас есть старший байт в начале. С
hash11 += curByte.ToString("X2")
у вас есть младший байт в начале.
То, что вы хотите получить, это шестнадцатеричное представление массива байтов: каждый байт должен быть представлен его шестнадцатеричным значением из двух символов.
Вы можете проверить эту ветку для нескольких различных примеров того, как это сделать.