什么是允许您“更新”它们的MD5 / SHA属性?例如,如果你有“test”的哈希值,你可以添加“case”来获取“testcase”的哈希值。我想稍微阅读一下这个属性,但我的搜索没有任何结果......
答案 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中实现了这种方法 - 它似乎工作正常。我应该在哪里上传代码?