MD5 / SHA“更新”属性?

时间:2010-11-30 00:28:16

标签: hash properties md5

什么是允许您“更新”它们的MD5 / SHA属性?例如,如果你有“test”的哈希值,你可以添加“case”来获取“testcase”的哈希值。我想稍微阅读一下这个属性,但我的搜索没有任何结果......

3 个答案:

答案 0 :(得分:2)

只是它们实际上是递增计算的 - 你通过操作数据的前n个字节来计算它们(在MD5的情况下为128,参见http://en.wikipedia.org/wiki/MD5#Algorithm),然后在接下来的n个字节上数据等

答案 1 :(得分:1)

编辑:由于我在下面提到的1位填充,这在理论上甚至是不可能的。实际上,md5("case", seed=md5("test")) == md5("test" + <1-bit> + "case")。无法使用md5("test")逐步计算md5("test" + "case")

如果连接512位块,理论上这是可行的。它不适用于将“case”附加到“test”,因为状态机的第一次运行被用于将“case”转换为512位块的填充所污染。

此外,填充不仅仅是一堆零。消息总是首先用1位填充,因此“case”和“case \ 0”产生不同的哈希值。因此,你不能依赖具有相同散列的“case”,无论是否有填充。

答案 2 :(得分:1)

MD5算法具有以下步骤:

1) pad input string to a multiple of 64 bytes
2) split input string into blocks of 64 bytes
3) initialise state (a 4-element array)
4) for each block: state <= transform(state,block)
5) encode state as string

为了支持您想要分阶段散列某些内容的情况(例如大文件),可以按以下方式重构:

初​​始化:

1) initialise state
2) leftover bytes <= ""

更新

1) append leftover bytes to start of input string
2) split input string into blocks of 64 bytes
3) for each complete block: state <= transform(state,block)
4) leftover bytes <= contents of the incomplete block, if one exists

摘要:

1) pad a copy of the leftover bytes
2) split the padded leftover bytes into blocks of 64 bytes
2) tmp_state <= state
2) for each block: tmp_state <= transform(tmp_state,block)
3) encode tmp_state as string

我实际上已经在VBA中实现了这种方法 - 它似乎工作正常。我应该在哪里上传代码?