我正在尝试实现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|
答案 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:1
与X
modulo {{1}一致如果Y
。