无法在Java中输出正确的哈希值.怎么了?

far*_*dve 4 java android sha

在我的Android应用程序中,我有一个SHA256哈希值,我必须使用RIPEMD160消息摘要算法进一步散列.

我可以输出任何字符串的正确sha256和ripemd160哈希,但是当我尝试使用ripemd160散列sha256哈希时,我得到一个不正确的哈希值.

根据在线哈希计算器,字符串'test'(全部小写)的SHA256值为:

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
Run Code Online (Sandbox Code Playgroud)

字符串'test'的RIPEMD160值为:

5e52fee47e6b070565f74372468cdc699de89107
Run Code Online (Sandbox Code Playgroud)

根据在线计算,使用ripemd160散列生成的sha256哈希的值为:

4efc1c36d3349189fb3486d2914f56e05d3e66f8
Run Code Online (Sandbox Code Playgroud)

而我的应用程序给我的是:

cebaa98c19807134434d107b0d3e5692a516ea66
Run Code Online (Sandbox Code Playgroud)

这显然是错的.

这是我的代码:

public static String toRIPEMD160(String in)
{
    byte[] addr = in.getBytes();
    byte[] out = new byte[20];
    RIPEMD160Digest digest = new RIPEMD160Digest();
    byte[] sha256 = sha256(addr);
    digest.update(sha256,0,sha256.length);
    digest.doFinal(out,0);
    return getHexString(out);
}

public static byte[] sha256(byte[] data)
{
    byte[] sha256 = new byte[32];
    try
    {
        sha256 = MessageDigest.getInstance("SHA-256").digest(data);
    }
    catch(NoSuchAlgorithmException e)
    {}

    return sha256;
}
Run Code Online (Sandbox Code Playgroud)

对于ripemd160算法,sha256需要bouncycastle和java.security.MessageDigest.

Ian*_*rts 8

您的"在线计算器"结果是使用SHA-256对字符串"test"的字节进行散列,将该散列的结果转换为十六进制字符串,然后获取与该十六进制字符串的ASCII字符对应的字节并进行散列的结果那是第二次.这与您的Java代码非常不同,Java代码将第一个哈希中的字节直接传递给第二个哈希,而不将它们打印为十六进制,并将这些字符转换回其间的字节.值为254(十进制)的单字节变为十六进制的"fe",当转换回字节时,变为双字节序列[0x66,0x65].