2016-09-01 120 views
0

對於加密專家,我有一個問題最近進入我的腦海。因此,例如,認爲我們有一長串字節,並且我們希望將該字符串放入一個散列函數中,我們可以將其用於說明爲SHA1。正如我們所知,SHA1以64字節塊爲單位輸入,並且每個散列函數afaik在處理之前需要填充消息。現在的問題是,它是最後一塊需要填充還是整個字符串?這很重要,因爲在填充結束時我們會添加長度。謝謝大家。長哈希的填充問題

回答

0

現在的問題是,它是最後一塊需要填充或整個字符串?

我相信這兩樣東西都是一樣的。填充整個字符串表示僅填充最後一個塊。

從好老維基一些僞here

看看代碼可能會給你一些啓發: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); 
} 
+0

但在整個字符串的情況下,長度爲:

來自不等於字符串的最後未填充部分的長度。填充後,我們需要在最後8個字節中插入長度。但是這是多長?這是整個信息的長度嗎? –

+1

是...整個消息的長度與填充 – PRP

+0

如果是這樣,謝謝,非常微妙的細節有時模糊的東西:) –