我目前正在实现一个基于 MD5 哈希算法的 RSA 数据安全代码,在 UpdateData 方法中有一段内容如下:
mCount[0] += (length << 3);
if (mCount[0] < (length << 3))
{
mCount[1]++;
}
我目前正在尝试了解 if 语句如何评估为真( mCount[0] 值初始化为 0)。任何帮助将不胜感激。
谢谢
我目前正在实现一个基于 MD5 哈希算法的 RSA 数据安全代码,在 UpdateData 方法中有一段内容如下:
mCount[0] += (length << 3);
if (mCount[0] < (length << 3))
{
mCount[1]++;
}
我目前正在尝试了解 if 语句如何评估为真( mCount[0] 值初始化为 0)。任何帮助将不胜感激。
谢谢
如果 mCount[0] 变量溢出,就会发生这种情况。
unsigned int i = 4294967295;//2^32-1
unsigned int j = 1;
i += j;
assert(i < j);
您提到的代码块可能会被多次调用,具体取决于要处理的数据量。所以 mCount[0] 最终会溢出。
这是用于进位传播,长度*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)
As Eric and Brian point out, this happens has when mCount[0] overflows, which happens every 500mb (2^29), so if you hash files/data streams larger than 500mb you will see this code trigger.
Using two 32bit counters, allows for 2^61 bytes of input before the counter truly overflows.
只要 mCount[0] 在加法之前为负并且加法本身没有溢出,就会发生这种情况。
我知道这在技术上不是您编程问题的答案,但老实说,我可以给您的最有价值的建议是您应该使用广泛使用且经过严格审查的 MD5(或任何其他加密)算法,不要滚动你自己。我怎么能巧妙地说出这个......如果你问的是关于整数数学的问题,这个建议是双重正确的。通往地狱的道路上到处都是那些试图自己实施棘手的加密但没有完全理解他们在做什么的人的尸体,最终在这个过程中留下了巨大的安全漏洞。聪明点,使用别人的调试实现,利用你自己的宝贵时间来实现你无法从其他地方获得的系统部分。