长哈希填充问题

Padding Issue of Long Hashes

本文关键字:问题 填充 哈希      更新时间:2023-10-16

对于加密专家,我最近想到了一个问题。举个例子,假设我们有一个很长的字节串,我们想把这个字符串放入一个散列函数中,我们可以把它作为SHA1来说明。正如我们所知,SHA1以64字节的块为输入,afaik的每个哈希函数在处理之前都需要填充消息。现在的问题是,是最后一个块需要填充还是整个字符串?这很重要,因为在填充结束时,我们会附加长度。谢谢所有。

现在的问题是,是最后一个块需要填充还是整个字符串?

我相信这两件事是一样的。填充整个字符串意味着只填充最后一个块。

一些来自wiki的伪代码

查看代码可能会给你一些启示:

摘自:mattmahoney.net/dc/sha1.c

void SHA1PadMessage(SHA1Context *context)
{
    /*
     *  Check to see if the current message block is too small to hold
     *  the initial padding bits and length.  If so, we will pad the
     *  block, process it, and then continue padding into a second
     *  block.
     */
    if (context->Message_Block_Index > 55)
    {
        context->Message_Block[context->Message_Block_Index++] = 0x80;
        while(context->Message_Block_Index < 64)
        {
            context->Message_Block[context->Message_Block_Index++] = 0;
        }
        SHA1ProcessMessageBlock(context);
        while(context->Message_Block_Index < 56)
        {
            context->Message_Block[context->Message_Block_Index++] = 0;
        }
    }
    else
    {
        context->Message_Block[context->Message_Block_Index++] = 0x80;
        while(context->Message_Block_Index < 56)
        {
            context->Message_Block[context->Message_Block_Index++] = 0;
        }
    }
    /*
     *  Store the message length as the last 8 octets
     */
    context->Message_Block[56] = context->Length_High >> 24;
    context->Message_Block[57] = context->Length_High >> 16;
    context->Message_Block[58] = context->Length_High >> 8;
    context->Message_Block[59] = context->Length_High;
    context->Message_Block[60] = context->Length_Low >> 24;
    context->Message_Block[61] = context->Length_Low >> 16;
    context->Message_Block[62] = context->Length_Low >> 8;
    context->Message_Block[63] = context->Length_Low;
    SHA1ProcessMessageBlock(context);
}