我试图在C ++中编写SHA-1的实现。但出于某种原因,我无法让它发挥作用。两个值不会正确加起来。
我使用this链接检查输入test
在函数的第一轮(对于单词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
。由于某种原因,价值下降,我不知道为什么。
答案 0 :(得分:0)
您的变量有哪些类型?如果您使用unsigned long long
,它们会溢出。
请考虑使用或转换为uint64_t
或test.py
。
答案 1 :(得分:0)
这是正常的和预期的。 SHA1中使用的加法定义为加法模2 32 ,这在添加32位bitvectors时自然发生。没有第33位因此无法设置。
链接页面显示了一些额外的位,但这基本上只是为了show。它们不会影响结果,它们会在那些额外的位有任何影响任何内容之前被明确截断。
实际上,这些位首先不存在,因为截断是隐含的。