Строковый хэш против двоичного хэша в Java - PullRequest
0 голосов
/ 12 марта 2019

Я пишу программу на Java, которая конвертирует биткойн privateKey в формат WIF.К сожалению, я ошибся в хэше SHA256.

Мой код основан на Basing на этого урока .

Когда я хеширую значение вроде:

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;

Конечно, я искал эту проблему в Интернете и нашел этот сайт .

На этом сайте есть два текстовых поля - String hash и Binary Hash.Используя хэш String, я получил тот же неверный результат, что и в моей Java-программе.Но, используя бинарный хэш, я получил правильный результат.

Мой вопрос: в чем разница между двоичными и строковыми хэшами?Как реализовать двоичный хэш в моем методе Java?

1 Ответ

1 голос
/ 12 марта 2019

В вашем случае 800C28... - это текстовое представление byte[] с использованием шестнадцатеричной кодировки.Чтобы преобразовать его обратно в byte[], вы можете взглянуть на этот ответ , один из способов сделать это:

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() вернет значения символов,например, символ 8 имеет значение 56 согласно в таблице ASCII .

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