【发布时间】:2011-08-14 10:31:04
【问题描述】:
所以我不确定我这样做是否正确。我这里是伪代码:http://en.wikipedia.org/wiki/MD5
上面写着:
//Pre-processing:
append "1" bit to message
append "0" bits until message length in bits ≡ 448 (mod 512)
append length to message
在 java 中,我能否将消息转换为字节数组。然后通过获取字符串长度 * 8 来获取位数。然后执行448 - ((#bits+1) mod 512) 之类的操作来获取要附加到的 0 位数。
然后将该字节数组复制到另一个数组,但用 0 和 1 填充第一个字节。
例子:
字符串为 746 位
然后我会做448 - ((746+1) mod 512) = 213
所以我需要用 213 个“0”位和 1 个“1”位填充字符串。
那么我的数组会是这样的
byteArr[0] = 0x00
byteArr[1] = 0x00
...
byteArr[27] = 000001(Rest of message bits)
byteArr[n] = Rest of the bytes from message
我怎样才能知道 1 的去向?基本上,如果我附加 1 位,我如何才能知道它是否会创建一个短路。
有没有更简单的方法或其他方法可以做到这一点?
【问题讨论】:
-
我不鼓励您使用
MD5。我当然会推荐最低限度的SHA256salted。在我下面的代码中,您可以传递MD5或SHA-512或SHA-256等等,但MD5(128 位)不如SHA-1(160 位)安全。SHA-256(256 位)。您可以使用更安全的TripleDES。 -
@Ali 是的,我知道 SHA 和 MD5 的区别以及如何使用它们。我想实现MD5的算法。不过还是谢谢。
-
这里要实现的关键点(除了 append 意味着到末尾):MD5 和其他哈希函数是基于位定义的,而不是字节。理论上,您可以散列一条 13 位长的消息,结果与散列一条以相同方式开始或结束的 16 位长消息不同。但在实践中,几乎所有实现(很可能包括您的实现)都假设输入消息由整个字节组成。
标签: java algorithm md5 implementation