SHA-1的c++实现中的错误散列
Wrong hash in C++ implementation of SHA-1
我正在尝试用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);
我在压缩函数的末尾有这五个变量(正如您在页面底部看到的那样,它们是正确的)
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++中实现LinkedList时,应出现未处理的错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 在 c++ 中实现 Trie 时出现分段错误
- C++ 实现模板单例类时出现链接错误
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- C++数组队列实现方法错误
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- 分段 排序函数实现中的错误
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 使用 std::forward_list 返回错误的队列实现
- 在我的trie实现中出现分段错误
- 在 c++ 中实现链表时出现分段错误
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 如何知道C2259 VS 2017错误未实现哪种方法?
- 筛子的埃拉托色尼错误实现
- BAD_ALLOC错误实现向量调整大小函数时
- 头文件中包含.cpp重新定义错误-实现通用堆栈
- 程序没有给出期望的输出.FIFO的错误实现
- 这是卡达内算法的错误实现吗?
- 双链表错误实现Deque