溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中怎么生成比特幣錢包地址

發(fā)布時(shí)間:2021-07-02 14:05:18 來源:億速云 閱讀:296 作者:Leah 欄目:互聯(lián)網(wǎng)科技

Java中怎么生成比特幣錢包地址,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

什么是比特幣地址?

比特幣地址是一個(gè)隨機(jī)查找的十六進(jìn)制字符串,在比特幣網(wǎng)絡(luò)中用于發(fā)送和接收比特幣。它是公私不對(duì)稱ECDSA密鑰的公共部分。相應(yīng)的私鑰用于簽署比特幣交易,作為交易時(shí)來自你的確認(rèn)和證明。

從技術(shù)上講,比特幣地址是從ECDSA密鑰的公共部分生成的,使用SHA-256RIPEMD-160進(jìn)行hash,如下文所述,處理得到的結(jié)果hash,最后使用Base58校驗(yàn)編碼對(duì)密鑰進(jìn)行編碼。

讓我們看看如何使用JCE(java加密擴(kuò)展),Bouncy Castle(RIPEMD-160)以及最后在bitcoinj庫中使用Base58編碼功能來完成所有這些工作。

生成ECDSA密鑰對(duì)

我們之前已經(jīng)介紹過生成RSA公鑰和私鑰。比特幣使用ECDSA代替RSA作為關(guān)鍵算法。它生成如下:

Elliptic Curve算法創(chuàng)建KeyPairGenerator。

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");

使用指定橢圓曲線是secp256k1。

ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");
keyGen.initialize(ecSpec);

一旦獲得KeyPairGenerator后,你可以創(chuàng)建KeyPair即密鑰對(duì),從中可以獲取公鑰和私鑰。

KeyPair kp = keyGen.generateKeyPair();
PublicKey pub = kp.getPublic();
PrivateKey pvt = kp.getPrivate();

ECDSA私鑰

你可以只存儲(chǔ)密鑰的私有部分,因?yàn)楣€可以從私鑰派生。

ECPrivateKey epvt = (ECPrivateKey)pvt;
String sepvt = adjustTo64(epvt.getS().toString(16)).toUpperCase();
System.out.println("s[" + sepvt.length() + "]: " + sepvt);

靜態(tài)方法adjustTo64()僅填充帶有前導(dǎo)0的十六進(jìn)制字符串,因此總長度為64個(gè)字符。

static private String adjustTo64(String s) {
    switch(s.length()) {
    case 62: return "00" + s;
    case 63: return "0" + s;
    case 64: return s;
    default:
        throw new IllegalArgumentException("not a valid key: " + s);
    }
}

這是由上面的代碼生成的示例私鑰。

s[64]: 024C8E05018319CED4BB04E184C307BFF115976A05F974C7D945B5151E490ADE

這個(gè)值通常是由數(shù)字錢包存儲(chǔ)的值。

ECDSA公鑰

上面生成的密鑰的公共部分被編碼為比特幣地址。首先,ECDSA密鑰由橢圓曲線上的點(diǎn)表示。該點(diǎn)的X和Y坐標(biāo)包括公鑰。它們在開頭與“04”連接在一起代表公鑰。

ECPublicKey epub = (ECPublicKey)pub;
ECPoint pt = epub.getW();
String sx = adjustTo64(pt.getAffineX().toString(16)).toUpperCase();
String sy = adjustTo64(pt.getAffineY().toString(16)).toUpperCase();
String bcPub = "04" + sx + sy;
System.out.println("bcPub: " + bcPub);
# prints
bcPub: 04CAAA5C0BDDAA22C9D3C0DDAEC8550791891BB2C2FB0F9084D02F927537DE4F443ACED7DEB488E9BFE60D6C68596E6C78D95E20622CC05474FD962392BDC6AF29

執(zhí)行SHA-256和RIPEMD-160哈希

我們現(xiàn)在需要在公鑰上執(zhí)行SHA-256,然后是RIPEMD-160。

MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] s1 = sha.digest(bcPub.getBytes("UTF-8"));
System.out.println("  sha: " + bytesToHex(s1).toUpperCase());
# prints
  sha: 7524DC35AEB4B62A0F1C90425ADC6732A7C5DF51A72E8B90983629A7AEC656A0

我們使用Bouncy Castle提供程序來執(zhí)行RIPEMD-160,因?yàn)?code>JCE沒有實(shí)現(xiàn)此算法。

MessageDigest rmd = MessageDigest.getInstance("RipeMD160", "BC");
byte[] r1 = rmd.digest(s1);

接下來,我們需要在哈希開頭添加一個(gè)0x00的版本字節(jié)。

byte[] r2 = new byte[r1.length + 1];
r2[0] = 0;
for (int i = 0 ; i < r1.length ; i++) r2[i+1] = r1[i];
System.out.println("  rmd: " + bytesToHex(r2).toUpperCase());
# prints
  rmd: 00C5FAE41AB21FA56CFBAFA3AE7FB5784441D11CEC

重復(fù)SHA-256哈希兩次

我們現(xiàn)在需要對(duì)上面的結(jié)果執(zhí)行兩次SHA-256哈希。

byte[] s2 = sha.digest(r2);
System.out.println("  sha: " + bytesToHex(s2).toUpperCase());
byte[] s3 = sha.digest(s2);
System.out.println("  sha: " + bytesToHex(s3).toUpperCase());

第二次散列結(jié)果的前4個(gè)字節(jié)用作地址校驗(yàn)和。它附加到上面的RIPEMD160哈希。這是25字節(jié)的比特幣地址。

byte[] a1 = new byte[25];
for (int i = 0 ; i < r2.length ; i++) a1[i] = r2[i];
for (int i = 0 ; i < 5 ; i++) a1[20 + i] = s3[i];

使用Base58對(duì)地址進(jìn)行編碼

我們現(xiàn)在使用bitcoinj庫中的Base58.encode()方法來獲得最終的比特幣地址。

System.out.println("  adr: " + Base58.encode(a1));
# prints
  adr: 1K3pg1JFPtW7NvKNA77YCVghZRq2s1LwVF

這是比特幣應(yīng)在交易中發(fā)送到的地址。

這是一個(gè)如何在java中生成比特幣地址的演示文稿。我們生成一個(gè)ECDSA密鑰對(duì),使用SHA256RIPEMD160哈希密鑰的公共部分。最后,我們通過執(zhí)行SHA256兩次并選取前4個(gè)字節(jié)來計(jì)算校驗(yàn)和,該字節(jié)附加到上面的RIPEMD160哈希。結(jié)果使用Base58編碼進(jìn)行編碼。

覺得有點(diǎn)復(fù)雜,也可以看這個(gè)Java離線生成比特幣地址

建議你瀏覽我們匯智網(wǎng)的各種編程語言的區(qū)塊鏈教程和區(qū)塊鏈技術(shù)博客,更深入了解區(qū)塊鏈,比特幣,加密貨幣,以太坊,和智能合約。

  • java比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。

  • php比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。

  • php以太坊,主要是介紹使用php進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。

  • java以太坊開發(fā)教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解。

  • 以太坊入門教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。

  • 以太坊開發(fā)進(jìn)階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。

  • python以太坊,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。

  • C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。

  • EOS入門教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開發(fā)。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI