0
對於加密專家,我有一個問題最近進入我的腦海。因此,例如,認爲我們有一長串字節,並且我們希望將該字符串放入一個散列函數中,我們可以將其用於說明爲SHA1。正如我們所知,SHA1以64字節塊爲單位輸入,並且每個散列函數afaik在處理之前需要填充消息。現在的問題是,它是最後一塊需要填充還是整個字符串?這很重要,因爲在填充結束時我們會添加長度。謝謝大家。長哈希的填充問題
對於加密專家,我有一個問題最近進入我的腦海。因此,例如,認爲我們有一長串字節,並且我們希望將該字符串放入一個散列函數中,我們可以將其用於說明爲SHA1。正如我們所知,SHA1以64字節塊爲單位輸入,並且每個散列函數afaik在處理之前需要填充消息。現在的問題是,它是最後一塊需要填充還是整個字符串?這很重要,因爲在填充結束時我們會添加長度。謝謝大家。長哈希的填充問題
現在的問題是,它是最後一塊需要填充或整個字符串?
我相信這兩樣東西都是一樣的。填充整個字符串表示僅填充最後一個塊。
從好老維基一些僞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);
}
但在整個字符串的情況下,長度爲:
來自不等於字符串的最後未填充部分的長度。填充後,我們需要在最後8個字節中插入長度。但是這是多長?這是整個信息的長度嗎? –
是...整個消息的長度與填充 – PRP
如果是這樣,謝謝,非常微妙的細節有時模糊的東西:) –