2016-09-17 67 views
0

我正在尝试在C++中编写SHA-1的实现。但由于某种原因,我无法让它工作。两个值不会正确相加。二进制值不能正确相加

我使用this链路来检查SHA-1与输入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

这是正常的和预期的。在SHA1中使用的加法被定义为加法模2 2 ,其在添加32位比特向量时自然发生。没有第33位,所以不能设置。

链接的页面显示了一些额外的位,但这基本上只是为了演示。它们不会影响结果,它们会在该页面上显式截断,然后这些额外的位有可能影响任何内容。

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

+0

所以我的代码表现得应该如此? – Cartman123

+0

是的,这个结果没有问题。 – harold

0

你的变量有哪些类型?如果您使用的是unsigned int,则会溢出。 考虑使用或铸造到unsigned long longuint64_t

+0

这是用于SHA1,它们*必须*换成32位整数 – harold

+0

我相信Cartman123想要打印'LEFTROTATE(a,5)+ f'并获得'6465469738' - 为此,他需要使用64位整数 –