MD5-PADDING在哪个位置开始?

时间:2015-11-02 10:24:56

标签: md5 padding

我正在尝试实现MD5 File-Hash,我认为它将在不久的将来完成。目前我需要附加PADDING,但我不明白这是如何工作的。

示例:我有一个包含109字节数据的文件。

//    512 Bit            360 Bit      
//  -------------     -------------    
//  |xxxxxxxxxxx|     |xxxxxx     |     
//  -------------     -------------

将PADDING附加到数据时,是否必须如下所示:

//    512 Bit            360 Bit           512 Bit
//  -------------     -------------     ------------- 
//  |xxxxxxxxxxx|     |xxxxxx|1|00|     |00000000|64|
//  -------------     -------------     -------------

或者

//    512 Bit            512 Bit      
//  -------------     -------------    
//  |xxxxxxxxxxx|     |xxx|1|00|64|     
//  -------------     -------------

还是这个?

//    512 Bit            360 Bit           512 Bit
//  -------------     -------------     ------------- 
//  |xxxxxxxxxxx|     |xxxxxx     |     |10000000|64|
//  -------------     -------------     -------------

我很困惑。在咨询RFC1321文本后,我认为如果可以在块内填充,则在SAME块中使用填充。如果这不适合,那么使用一个新块。

我是对的吗?

编辑:需要更多细节。

填充在哪里? 在最后一个数据位或最后一个数据字节之后?或者这是一样的吗?

喜欢这个吗?

                512 Bit-Block
--------------------------------------------------
|1|1|0|X0000000|                 |0|0|0|0|0|0|0|1|

|0|0|0|00000000|                 |0|0|0|0|0|0|0|0|
|0|0|4|00000000|                 |0|0|0|0|0|0|0|1|
|0|0|6|00000000|    ...          |0|0|0|0|0|0|0|1|
|1|1|8|00000000|                 |0|0|0|0|0|0|0|1|
|1|1|0|00000000|                 |0|0|0|0|0|0|0|1|
|0|1|0|00000000|                 |0|0|0|0|0|0|0|1|
|1|1|0|00000000|                 |0|0|0|0|0|0|0|0|
--------------------------------------------------  
|DATA |PADDING                   | 64 Bit counter|

还是喜欢这个?

                512 Bit-Block
--------------------------------------------------
|1|1|0|00000000|                 |0|0|0|0|0|0|0|1|
|0|0|0|00000000|                 |0|0|0|0|0|0|0|0|
|0|0|4|00000000|                 |0|0|0|0|0|0|0|1|
|0|0|6|00000000|    ...          |0|0|0|0|0|0|0|1|
|1|1|8|00000000|                 |0|0|0|0|0|0|0|1|
|1|1|X|00000000|                 |0|0|0|0|0|0|0|1|
|0|1|0|00000000|                 |0|0|0|0|0|0|0|1|
|1|1|0|00000000|                 |0|0|0|0|0|0|0|0|
--------------------------------------------------  
|DATA |PADDING                   | 64 Bit counter|

1 个答案:

答案 0 :(得分:2)

RFC已明确定义:

  

消息被“填充”(扩展),以便其长度(以位为单位)      一致到448,模512. [...]总之,在      附加至少一位且最多512位。

所以基本上,在添加长度之前,你的最后一个块必须是448位长。因此,如果您有109个字节的数据,872位,则需要将88位附加到最后一个块:

//    512 Bits           512 Bits     
//  -------------     -------------    
//  |xxxxxxxxxxx|     |xxxxxx10064|     
//  -------------     -------------

其中100实际上是一个1位后跟87 0位,而64是原始消息的长度(872 in你的情况)。

如果您的消息类似于960位长(512 + 448),那么您将添加整个512位块(一个1和511 {{1如果它是0位长(959),则应该只添加一个512 + 447位。这是两种极端情况。

注意:也许您不知道congruent是什么意思,而您正在努力理解RFC:1X modulo {{1}一致如果Y