Accounts

如何從java中的私鑰獲取地址

  • July 25, 2017

我使用在 java 程式碼中生成私鑰HashUtil.sha3("cow".getBytes())

寫入新的私鑰文件:

c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4

然後,我使用,我在 geth 中geth account import得到了一個地址。["0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826"]

但是當我嘗試在 Java 中獲取公共地址時,它顯示了一個不同的地址:

BigInteger pk = new BigInteger(senderPrivKey);
ECKey key = ECKey.fromPrivate(pk);
System.out.println("address\t: " + Hex.toHexString(key.getAddress()) );

結果是address : 8e54de809503da0a87309f8d5e98f77551ddd7f5

我希望顯示地址cd2a3d9f938e13cd947ec05abc7fe734df8dd826,我是否使用了錯誤的程式碼?

我還學習了EthereumJ中的 ECKeyTest.java,有單元測試首先從私鑰獲取公鑰,然後從公鑰獲取地址。但就我而言,結果仍然是8e54de809503da0a87309f8d5e98f77551ddd7f5.

概括

問題中的程式碼理論上不應該執行,因為私鑰是十六進制格式,並且在new BigInteger(senderPrivKey)沒有指定基數的情況下解析十六進製字元串的呼叫16將導致拋出異常。

當程式碼調整為使用new BigInteger(senderPrivKey, 16)指定基數 16 基數時,會按預期生成公鑰。


細節

這是一個工作範例。保存為TestKey.java,編譯執行。

import java.math.BigInteger;

import org.ethereum.crypto.ECKey;
import org.spongycastle.util.encoders.Hex;

public class TestKey {

   public static void main(String[] args) {
       String senderPrivKey = "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4";

       BigInteger pk = new BigInteger(senderPrivKey, 16);
       System.out.println("Private key: " + pk.toString(16));

       ECKey key = ECKey.fromPrivate(pk);
       System.out.println("Public key: " + Hex.toHexString(key.getAddress()));
   }
}

以及執行時的輸出:

Private key: c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4
Public key: cd2a3d9f938e13cd947ec05abc7fe734df8dd826

我使用了以下 Maven 依賴項:

   <dependency>
       <groupId>org.ethereum</groupId>
       <artifactId>ethereumj-core</artifactId>
       <version>1.1.0-RELEASE</version>
       <!--  <type>zip</type>  -->
   </dependency>

我不知道您的程式碼是如何執行的,因為當我在上面的原始碼中更改以下行以匹配您的程式碼時,BigInteger(...)建構子期望解析一個以 10 為基數的數字而不是一個以 16 為基數的數字:

       BigInteger pk = new BigInteger(senderPrivKey);

我得到以下異常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "c"
   at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
   at java.lang.Integer.parseInt(Integer.java:580)
   at java.math.BigInteger.<init>(BigInteger.java:461)
   at java.math.BigInteger.<init>(BigInteger.java:597)
   at TestKey.main(TestKey.java:14)

引用自:https://ethereum.stackexchange.com/questions/3169