HMAC SHA256, внутренний хэш работает, но внешний хэш не работает

У меня возникла проблема с интеграцией вывода моего SHA256 с HMAC. Первый/внутренний SHA256 соответствует ожидаемому результату, а второй/внешний — нет.

Я следую первому примеру здесь:

https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA256.pdf

Я знаю:

  • Мой К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до; реализация была помечена как не инвариантная с порядком байтов и не имеет значения из-за того, как она используется (ключ кэша локального компьютера).

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