代码之家  ›  专栏  ›  技术社区  ›  intrigued_66

HMAC SHA256,内部哈希有效,但外部哈希失败

  •  0
  • intrigued_66  · 技术社区  · 2 年前

    我在将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位以上的消息输入上正确工作。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Joshua    2 年前

    std::array<uint32_t, 8>

    这很奇怪。预期: std::array<uint8_t, 32>

    我怀疑你有字节顺序问题。

    虽然我看到散列的输出用 uint32 之前该实现被标记为不是endian不变量,这并不重要,因为它是如何使用的(本地机器缓存密钥)。