c++ - SHA-1 的 C++ 实现中的错误散列

标签 c++ sha1

我正在尝试用 C++ 编写 SHA-1 的实现。出于某种原因,我得到的输出与我预期的不同。

输入 test 的结果应该是 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

我得到的是输出 e58f4aa9a69bb1cc73084c1c87e991d3d3bb2f98

我有以下功能

void sha1(const uint8_t *org_msg, size_t org_len, uint8_t *digest)

我称之为像

// msg = original input
// org_len = original length of input
// output = uint8_t output[20];
sha1((uint8_t *)msg.c_str(), org_len, output);

我在压缩函数的末尾有这五个变量(如您在页面底部看到的 here 是正确的)

h0 = 10101001010010101000111111100101
h1 = 11001100101100011001101110100110
h2 = 00011100010011000000100001110011
h3 = 11010011100100011110100110000111
h4 = 10011000001011111011101111010011

变量都是uint32_t类型。现在我想将它们转换为 uint8_t 我有以下功能:

void to_bytes(uint32_t val, uint8_t *bytes) {
    bytes[0] = (uint8_t)val;
    bytes[1] = (uint8_t)(val >> 8);
    bytes[2] = (uint8_t)(val >> 16);
    bytes[3] = (uint8_t)(val >> 24);
}

我这样调用它

to_bytes(h0, digest);
to_bytes(h1, digest + 4);
to_bytes(h2, digest + 8);
to_bytes(h3, digest + 12);
to_bytes(h4, digest + 16);

然后最后像这样输出:

for (size_t i = 0; i < 20; i++) {
    printf("%2.2x", output[i]);
}

结果是 e58f4aa9a69bb1cc73084c1c87e991d3d3bb2f98

最佳答案

to_bytes 产生反向输出。 bytes[0] 将获取输入的最后 8 位,而您需要前 8 位。

关于c++ - SHA-1 的 C++ 实现中的错误散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39676318/

相关文章:

c++ - 动态规划问题 - 最小成本路径

C++ - 访问可执行文件上的 "dropped"文件

java - 检测密码加密类型——我可以将它们导入 Django 吗?

java - 上传新文件时如何同时获取文件MD5和SHA1校验和?

ruby - 为什么我得到的不是我预期的哈希值?

ruby - 将 SHA1 密码转换为其二进制形式

c++ - 如何将所有依赖项和共享库编译成一个二进制文件

C++ 错误 : does not have a class type

c++ - 在类中使用 libuv

维基百科转储中的 sha1sum