根据https://www.online-convert.com/result/952ea2f0-6d2a-4027-aebf-8309b3888ffb,Whirlpool哈希函数生成的“test”哈希是:
B913D5BBB8E461C2C5961CBE0EDCDADFD29F068225CEB37DA6DEFCF89849368F8C6C2EB6A4C4AC75775D032A0ECFDFE8550573062B653FE92FC7B8FB3B7BE8D6
现在,在以下几行代码中,我尝试在Java中实现相同的功能:
import gnu.crypto.hash.HashFactory;
import gnu.crypto.hash.IMessageDigest;
import gnu.crypto.util.Util;
import java.nio.charset.Charset;
public class Main {
public static void main(String[] args) {
byte[] input = "test".getBytes(Charset.forName("UTF-8"));
IMessageDigest md = HashFactory.getInstance("whirlpool");
md.update(input, 0, input.length);
byte[] digest = md.digest();
System.out.println("expected: B913D5BBB8E461C2C5961CBE0EDCDADFD29F068225CEB37DA6DEFCF89849368F8C6C2EB6A4C4AC75775D032A0ECFDFE8550573062B653FE92FC7B8FB3B7BE8D6");
System.out.println("real: " + Util.toString(digest));
}
}
输出如下:
expected: B913D5BBB8E461C2C5961CBE0EDCDADFD29F068225CEB37DA6DEFCF89849368F8C6C2EB6A4C4AC75775D032A0ECFDFE8550573062B653FE92FC7B8FB3B7BE8D6
real: E6B4AA087751B4428171777F1893BA585404C7E0171787720EBA0D8BCCD710DC2C42F874C572BFAE4CEDABF50F2C80BF923805D4E31C504B86CA3BC59265E7DD
使用空字符串(类似于selfTest),它返回预期的字符串。我正在使用https://www.gnu.org/software/gnu-crypto/中的gnu加密库2.0.1。
有没有人提示为什么真正的哈希与预期的哈希不匹配?
答案 0 :(得分:1)
我四处走动,玩着漩涡和哈希,最后使用了Bouncy Castle。如果我运行以下代码,则最后一行会给您您预期的B913 ....
public void bouncyCastle() {
WhirlpoolDigest messageDigest = new WhirlpoolDigest();
final String stringToHash = "test";
messageDigest.reset();
final byte[] bytes = stringToHash.getBytes();
messageDigest.update(bytes, 0, bytes.length);
byte[] hash = new byte[messageDigest.getDigestSize()];
messageDigest.doFinal(hash, 0);
System.out.println(Hex.toHexString(hash).toUpperCase());
}
这个网站是个不错的检查方法https://md5decrypt.net/en/Whirlpool/#answer
这是我添加到项目中的Maven依赖项。
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-ext-jdk15on</artifactId>
<version>1.64</version>
</dependency>