我在将SHA256的输出与HMAC集成时遇到问题。第一个/“内部”SHA256与预期输出匹配,但第二个/“外部”不匹配。
我在这里举第一个例子:
https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA256.pdf
我知道:
-
我的K0是正确的
-
我的
K0 xor ipad
是正确的
-
我的
K0 xor opad
是正确的
-
我的
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的工作原理,我认为问题在于“内部”8x
uint32_ts
SHA256输出附加到
K0 xor opad
用于最终的“外部”SHA256计算。
考虑到第一个SHA256作品,有人能提出什么建议吗?
注:
我不能发帖
GetSHA256()
但它只是返回8x的最终状态
uint32_t
s在SHA256转换期间使用。
GetASCIIRepresentation()
拆分每个
uint32_t
使用掩码和移位将其转换为8x 4位整数,然后转换为ASCII。
GetSHA256()
和
GetASCIIRepresentation()
经过单元测试,可在512位以上的消息输入上正确工作。