簡體   English   中英

關於 MD5 實現中的一行

[英]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->hictx->lo計數字節,就像size一樣。

您正確地注意到您只是將size (字節)添加到ctx->lo (然后檢查溢出/傳播溢出到ctx->hi )。 溢出檢查很簡單lo作為一個29位的integer,如果加/掩碼后的結果小於原來的值,則發生溢出。

used的檢查也證明ctx->loctx->hi是字節計數器body一次處理 64個字節的數據, lo計數器與0x3F (即 63)進行“與”運算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM