我目前正在实现基于MD5哈希算法的RSA数据安全代码,在UpdateData方法中有一节描述:
mCount[0] += (length << 3);
if (mCount[0] < (length << 3))
{
mCount[1]++;
}
我正在尝试理解if语句如何评估为true(mCount [0]值初始化为0)。任何帮助将不胜感激。
由于
答案 0 :(得分:8)
如果mCount [0]变量溢出,可能会发生这种情况。
unsigned int i = 4294967295;//2^32-1
unsigned int j = 1;
i += j;
assert(i < j);
您提到的代码块可能会多次调用,具体取决于要处理的数据量。所以mCount [0]最终会溢出。
答案 1 :(得分:5)
这是进位传播,长度* 8的总和存储在两个32位字中(这里,mCount可能是无符号整数数组)mCount [1]:mCount [0]。
lo += a
if (lo < a) hi++; // true if overflow occurs: lo + a >= 2^32
相当于64位操作:
(hi:lo) += (0:a)
答案 2 :(得分:0)
只要mCount [0]在添加之前为负,并且添加本身不会溢出,就会发生这种情况。
答案 3 :(得分:0)
我知道这在技术上不是你的编程问题的答案,但我真的认为我能给你的最有价值的建议是你应该使用广泛使用且经过良好审查的MD5(或任何其他加密)算法,不要自己动手。我怎么能把它巧妙地说出来......如果你问整数学的问题,这个建议是双重的。通往地狱的道路上到处都是人们的尸体,他们试图在不完全理解他们正在做的事情的情况下自己实施棘手的加密,最终在这个过程中留下了巨大的安全漏洞。要聪明,使用别人的调试实现,使用你自己宝贵的时间来实现你从其他地方无法获得的系统部分。
答案 4 :(得分:0)
正如Eric和Brian指出的那样,当mCount [0]溢出时会发生这种情况,每500mb(2 ^ 29)就会发生这种情况,所以如果你对大于500mb的文件/数据流进行散列,你会看到这个代码触发器。
使用两个32位计数器,在计数器真正溢出之前允许2 ^ 61个字节的输入。