[英]About one line in an implementation of MD5
我對 MD5 實現中的一行代碼感到困惑,
void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
{
MD5_u32plus saved_lo;
unsigned long used, available;
saved_lo = ctx->lo;
if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
ctx->hi++;
ctx->hi += size >> 29;
used = saved_lo & 0x3f;
if (used)
{
available = 64 - used;
if (size < available)
{
memcpy(&ctx->buffer[used], data, size);
return;
}
memcpy(&ctx->buffer[used], data, available);
data = (const unsigned char *)data + available;
size -= available;
body(ctx, ctx->buffer, 64);
}
if (size >= 64)
{
data = body(ctx, data, size & ~(unsigned long)0x3f);
size &= 0x3f;
}
memcpy(ctx->buffer, data, size);
}
問題行是if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
,似乎“大小”計數字節,但“ctx->lo”和“saved_lo”計數位。 為什么把它們加在一起? Github中也有一些類似的代碼,也有一些項目使用了這些代碼。 所以任何人都可以給出一些解釋嗎?
關於“位計數器”的評論可能具有誤導性ctx->hi
和ctx->lo
計數字節,就像size
一樣。
您正確地注意到您只是將size
(字節)添加到ctx->lo
(然后檢查溢出/傳播溢出到ctx->hi
)。 溢出檢查很簡單lo
作為一個29位的integer,如果加/掩碼后的結果小於原來的值,則發生溢出。
used
的檢查也證明ctx->lo
和ctx->hi
是字節計數器body
一次處理 64個字節的數據, lo
計數器與0x3F
(即 63)進行“與”運算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.