【问题标题】:Binary values don't add up correctly二进制值加起来不正确
【发布时间】:2016-09-17 10:52:41
【问题描述】:

我正在尝试用 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。由于某种原因价值下降,我不知道为什么。

【问题讨论】:

    标签: c++ sha1


    【解决方案1】:

    这是正常的,也是意料之中的。 SHA1 中使用的加法定义为模 232 的加法,这在添加 32 位位向量时自然发生。没有第 33 位,所以无法设置。

    链接页面显示了一些额外的位,但这基本上只是为了展示。它们不会影响结果,在那些额外的位有机会影响任何东西之前,它们会在该页面上被显式截断。

    实际上,这些位一开始就不存在,因为截断是隐式的。

    【讨论】:

    • 是的,这个结果没有问题。
    【解决方案2】:

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

    【讨论】:

    • 这是用于 SHA1,它们必须包装为 32 位整数
    • 我相信 Cartman123 想要打印 LEFTROTATE(a, 5) + f 并得到 6465469738 - 为此,他需要使用 64 位整数
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2016-03-13
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多