BTC公鑰生成地址的過程詳解
首先簡單介紹一下,BTC助記詞以及種子和公私鑰之間的關係:BTC助記詞生成種子,種子生成私鑰,私鑰生成公鑰,公鑰生成地址。
本文主要的內容是介紹公鑰生成地址的這一過程:
以該16進制公鑰做測試:02c041205ba02149d3e03c05ff67a6c519aa5d2bef293d2e7fc3951931bc9ad712
- 將公鑰進行SHA256哈希;
- 將第1步結果進行RIPEMD160哈希;
- 將BTC地址版本號(00)加在第2步結果前面;
- 將第3步結果進行雙SHA256哈希;
- 取第4步結果的前4字節,並加在第3步結果後面;
- 取第5步結果進行Base58編碼;
- 得到BTC地址,1開頭的普通地址。
具體java實現如下:
String publicKeyHex = "02c041205ba02149d3e03c05ff67a6c519aa5d2bef293d2e7fc3951931bc9ad712";
byte[] sha256Bytes = Sha256Hash.hash(Hex.decode(publicKeyHex));
//2.將第1步結果進行RIPEMD160哈希
RIPEMD160Digest digest = new RIPEMD160Digest();
digest.update(sha256Bytes, 0, sha256Bytes.length);
byte[] ripemd160Bytes = new byte[digest.getDigestSize()];
digest.doFinal(ripemd160Bytes, 0);
//3.將BTC地址版本號(00)加在第2步結果簽名
String result = "00" + Hex.toHexString(ripemd160Bytes);
//4.將第3步結果進行雙SHA256哈希
byte[] firstHash = Sha256Hash.hash(Hex.decode(result));
byte[] doubleHash = Sha256Hash.hash(firstHash);
//5.取第4步結果的前4字節,並加在第3步結果後面
String checksum = Hex.toHexString(doubleHash).substring(0, 8);
String checkStr = result + checksum;
String address = Base58.encode(Hex.decode(checkStr));
System.out.println(address); //1Ks88rwj2viLLhGuTcwNFWH4jKuQwAZYAJ
關於LTC地址的推導過程其實和BTC是一模一樣的,只不過LTC的地址版本號是 30
而不是 00
所需maven依賴:
<dependency>
<groupId>org.bitcoinj</groupId>
<artifactId>bitcoinj-core</artifactId>
<version>0.15.2</version>
</dependency>
當然,這是詳細過程,藉助 bitcoinj
這個jar包,完全可以直接生成1開頭的BTC地址以及bc1開頭的隔離見證地址,不過需要通過私鑰生成。