Private-Key

Java:將 256 位私鑰轉換為 WIF 的方法?

  • February 9, 2021

我有一個關於 Java 和 sha-256 的問題。

我嘗試執行此處描述的這些步驟來創建 WIF 密鑰: https ://en.bitcoin.it/wiki/Wallet_import_format

  1. 步:

字元串字元串 = “0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D”;

  1. 步驟(前面的廣告 80):

字元串=“80”+字元串;

  1. 執行 sha-256:
  • 這是我的錯誤。我可以在第 2 步執行 sha-256,但結果是錯誤的。原因似乎是對字元串而不是二進制執行雜湊。我得到:

e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09

但我應該得到:

8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592

我不知道如何將其轉換為二進制。有人能幫我嗎?

它與此處的問題相同(將 256 位私鑰轉換為 WIF 的正確方法?)但我不明白答案。我也無法回复該主題,因為我沒有足夠的聲譽。

謝謝 :)

您應該將字節的十六進製表示轉換為字節數組(而不是字元串到字節數組)。然後做雜湊。然後將字節數組轉換回字元串中字節的十六進製表示。

整個解決方案將如下所示:

import java.security.*;

class HashExample {
   public static void main(String[] args) throws NoSuchAlgorithmException {
       String string = "0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D";
       string = "80" + string;
       byte[] data = hexStringToByteArray(string);
       byte[] digest = MessageDigest.getInstance("SHA-256").digest(hexStringToByteArray(string));
       String result = bytesToHex(digest);
       System.out.println(result);
       //prints: 8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592
   }

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

   private static String bytesToHex(byte[] bytes) {
       StringBuffer result = new StringBuffer();
       for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
       return result.toString();
   }
}

當然這只是一個例子。在生產程式碼中,我建議使用可以執行此任務的可用庫之一。

引用自:https://bitcoin.stackexchange.com/questions/63949