二进制值不能正确加起来

时间:2016-09-17 10:52:41

标签: c++ sha1

我试图在C ++中编写SHA-1的实现。但出于某种原因,我无法让它发挥作用。两个值不会正确加起来。

我使用this链接检查输入test

的SHA-1的步骤

在函数的第一轮(对于单词0),我有我的代码示例:

#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))

a = 0xefcdab89;
b = 0x98badcfe;
c = 0x10325476;
d = 0xc3d2e1f0;

f = (b & c) | (d & (~b));

cout << LEFTROTATE(a, 5); // equal to 3903086636 (11101000101001000110000000101100)

cout << f; // equal to 2562383102 (10011000101110101101110011111110)

我希望这两个值加起来给我LEFTROTATE(a, 5) + f,但我得到以下内容:

cout << LEFTROTATE(a, 5) + f; // equal to 2170502442 (10000001010111110011110100101010)

我希望自6465469738 (110000001010111110011110100101010)以来输出为3903086636 + 2562383102 = 6465469738。由于某种原因,价值下降,我不知道为什么。

2 个答案:

答案 0 :(得分:0)

您的变量有哪些类型?如果您使用unsigned long long,它们会溢出。 请考虑使用或转换为uint64_ttest.py

答案 1 :(得分:0)

这是正常的和预期的。 SHA1中使用的加法定义为加法模2 32 ,这在添加32位bitvectors时自然发生。没有第33位因此无法设置。

链接页面显示了一些额外的位,但这基本上只是为了show。它们不会影响结果,它们会在那些额外的位有任何影响任何内容之前被明确截断。

实际上,这些位首先不存在,因为截断是隐含的。