HMAC SHA256, внутренний хэш работает, но внешний хэш не работает
У меня возникла проблема с интеграцией вывода моего SHA256 с HMAC. Первый/внутренний SHA256 соответствует ожидаемому результату, а второй/внешний — нет.
Я следую первому примеру здесь:
Я знаю:
- Мой К0 правильный
- Мой
K0 xor ipad
верно - Мой правильный
- Мой
Hash((Key^ipad)||text)
это даже правильно
Проблема заключается в представлении ASCII из конечного/внешнегоsha256()
это неверно.
я получил218135127ad7a8e5967ce7b47499214d1df46a9589eb0bec7637c86021fd928d
но это должно быть8BB9A1DB9806F20DF7F77B82138C7914D174D59E13DC4D0169C9057B133E1D62
Код:
// Up to this point ipad, opad, K0, both XORs all match the expected values
const std::array<uint32_t, 8>& h_output_1 = Hash<BUFFER_SIZE>(&xor_1[0], 64, &message[0], message_length);
// This is correct
LOG("H_1: " << sha256::GetASCIIRepresentation(h_output_1));
const std::array<uint32_t, 8>& h_output_2 = Hash<BUFFER_SIZE>(&xor_2[0], 64, &h_output_1[0], 32);
// This is NOT correct
LOG("H_2: " << sha256::GetASCIIRepresentation(h_output_2));
Hash()
добавляет два буфера и вычисляет SHA256.
Учитывая, что первый SHA256 работает, я думаю, проблема в том, как «внутренний» 8xuint32_ts
Вывод SHA256 добавляется кK0 xor opad
для окончательного «внешнего» расчета SHA256.
Учитывая, что первый SHA256 работает, может ли кто-нибудь что-нибудь подсказать?
Примечание:
Я не могу публиковать сообщения, но он просто возвращает окончательное состояние 8x, использованных во время преобразований SHA256.
разделяет каждыйuint32_t
в 8x 4-битных целых числа с использованием маскировки и сдвига, а затем преобразуется в ASCII.
GetSHA256()
иGetASCIIRepresentation()
прошли модульное тестирование и корректно работают с входными сообщениями длиной более 512 бит.
1 ответ
std::array<uint32_t, 8>
Это очень странно. Ожидал:std::array<uint8_t, 32>
Я подозреваю, что у вас проблема с порядком байтов.
Хотя я видел, как результат хеша выражается вuint32
до; реализация была помечена как не инвариантная с порядком байтов и не имеет значения из-за того, как она используется (ключ кэша локального компьютера).