【问题标题】:String hash vs Binary Hash in JavaJava中的字符串哈希与二进制哈希
【发布时间】:2019-08-02 07:23:25
【问题描述】:

我正在编写一个将比特币 privateKey 转换为 WIF 格式的 Java 程序。 不幸的是,我得到了错误的 SHA256 哈希值。

我的代码基于this tutorial

当我散列一个像这样的值时:

800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D

我得到这样的结果:

e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09

代替:

8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592

这是我的一段代码:

public String getSHA(String value){
    String hash = hash = DigestUtils.sha256Hex(value.getBytes());
    System.out.println(hash);
    return hash;
}

我使用了这个库:import org.apache.commons.codec.digest.DigestUtils;

当然我在网上搜索了这个问题,我找到了this site

在那个网站上,有两个文本框 - 字符串哈希和二进制哈希。 使用字符串哈希,我得到了与我的 Java 程序相同的错误结果。 但是,使用二进制哈希,我得到了正确的结果。

我的问题是: 二进制和字符串哈希有什么区别? 如何在我的 Java 方法中实现二进制哈希?

【问题讨论】:

标签: java hash bitcoin


【解决方案1】:

在您的情况下,800C28... 是使用十六进制编码的byte[] 的文本表示。要将其转换回byte[],您可以查看this answer,一种方法是:

public static byte[] hexStringToByteArray(String hex) {
  int l = hex.length();
  byte[] data = new byte[l/2];
  for (int i = 0; i < l; i += 2) {
    data[i/2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
      + Character.digit(hex.charAt(i+1), 16));
  }
  return data;
}

String.getBytes() 将返回字符值,例如根据the ASCII table,字符8 的值为56。

System.out.println(Arrays.toString("8".getBytes())); // 56

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2011-05-27
    • 2014-12-28
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2021-12-23
    相关资源
    最近更新 更多