1. 程式人生 > >使用Java生成比特幣錢包地址的過程

使用Java生成比特幣錢包地址的過程

比特幣錢包地址的生成過程

640?wx_fmt=png&wxfrom=5&wx_lazy=1

第一步,通過OpenSSL命令隨機生成金鑰對

生成橢圓曲線的私鑰

  1. openssl ecparam -name secp256k1 -genkey -out ec-priv.pem

執行上述命令會生成ec-prive.pem檔案,將其快速解碼為可讀的16進位制形式。

  1. openssl ec -in ec-priv.pem -text -noout

將上述金鑰對中的公鑰部分取出,儲存到一個叫做ec-pub.pem的外部檔案中:

  1. openssl ec -in ec-priv.pem -pubout -out ec-pub.pem

接著將它解碼

  1. openssl ec -in ec-pub.pem

    -pubin -text -noout

公鑰部分就會顯示出來

  1. read EC key

  2. Private-Key:(256 bit)

  3. pub:

  4. 04:4d:d2:58:cc:3e:05:0b:57:02:99:ef:45:de:5d:

  5. 96:e5:24:05:10:96:a2:a9:ae:52:d2:2b:a8:92:7b:

  6. 16:7f:ce:f2:97:f3:5a:0d:e8:b7:c5:78:92:64:d2:

  7.    de:85:8d:c8:58:2c:39:36:8c:39:9f:d9:1d:c5:a9:

  8. 2c:33:d8:5a:a1

  9. ASN1 OID: secp256k1

640?wx_fmt=jpeg

第二步,對公鑰進行SHA-256加密 

提取上述16進位制的公鑰,轉換成字串

  1. 044dd258cc3e050b570299ef45de5d96e524051096a2a9ae52d22ba8927b167fcef297f35a0de8b7c5789264d2de858dc8582c39368c399fd91dc5a92c33d85aa1

然後使用SHA-256加密

  1. byte[] publicKey =newBigInteger("044dd258cc3e050b570299ef45de5d96e524051096a2a9ae52d22ba8927b167fcef297f35a0de8b7c5789264d2de858dc8582c39368c399fd91dc5a92c33d85aa1",16).toByteArray

    ();

  2. byte[] sha256Bytes =Utils.sha256(publicKey);

  3. System.out.println("sha256加密="+Utils.bytesToHexString(sha256Bytes));

執行結果:

  1. sha256加密=C96A913851413BDC2FBF5CC60085CA2C23FB8289B44BDDAD5FC15226DB1E30A7

第三步,使用RIPEMD160加密

其中,RIPEMD160的加密使用了bouncycastle這個加密演算法庫。

  1.        RIPEMD160Digest digest =new RIPEMD160Digest();

  2.        digest.update(sha256Bytes,0, sha256Bytes.length);

  3. byte[] ripemd160Bytes =newbyte[digest.getDigestSize()];

  4.        digest.doFinal(ripemd160Bytes,0);

  5. System.out.println("ripemd160加密="+Utils.bytesToHexString(ripemd160Bytes));

執行結果:

  1. ripemd160加密=9AF1DD0C939624E1984CB56B44B9C5F28E6B21FF

第四步,將版本號新增到上述加密結果之前,變成21位 其中,Main Network:0x00, Test Network:0x64,Namecoin Net:0x34

這裡,使用Main Network

  1. byte[] networkID =newBigInteger("00",16).toByteArray();

  2. byte[] extendedRipemd160Bytes =Utils.add(networkID, ripemd160Bytes);

  3. System.out.println("新增NetworkID="+Utils.bytesToHexString(extendedRipemd160Bytes));

執行結果:

  1. 新增NetworkID=009AF1DD0C939624E1984CB56B44B9C5F28E6B21FF

第五步,兩次SHA-256加密

  1. byte[] twiceSha256Bytes =Utils.sha256(Utils.sha256(extendedRipemd160Bytes));

  2. System.out.println("兩次sha256加密="+Utils.bytesToHexString(twiceSha256Bytes));

執行結果:

  1. 兩次sha256加密=1C17FA056AABA3B6B9768F83F460BC190D19CC2890D933249781D476451D22B4

第六步,將兩次SHA-256加密後的結果取前4bytes,作為地址的checksum

  1. byte[] checksum =newbyte[4];

  2. System.arraycopy(twiceSha256Bytes,0, checksum,0,4);

  3. System.out.println("checksum="+Utils.bytesToHexString(checksum));

執行結果:

  1. checksum=1C17FA05

第七步,生成25-byte binary Bitcoin Address

需要將checksum加到第四步結果的最後,形成一個25位的地址。

  1. byte[] binaryBitcoinAddressBytes =Utils.add(extendedRipemd160Bytes, checksum);

  2. System.out.println("新增checksum之後="+Utils.bytesToHexString(binaryBitcoinAddressBytes));

執行結果:

  1. 新增checksum之後=009AF1DD0C939624E1984CB56B44B9C5F28E6B21FF1C17FA05

第八步,使用base58編碼生成比特幣的錢包地址

  1. String bitcoinAddress =Base58.encode(binaryBitcoinAddressBytes);

  2. System.out.println("bitcoinAddress="+ bitcoinAddress);

執行結果:

  1. bitcoinAddress=1F8GoWchAb56ePqftqRvLf7L729JGQSdqW

上述整個流程的程式碼:

  1. byte[] publicKey =newBigInteger("044dd258cc3e050b570299ef45de5d96e524051096a2a9ae52d22ba8927b167fcef297f35a0de8b7c5789264d2de858dc8582c39368c399fd91dc5a92c33d85aa1",16).toByteArray();

  2. byte[] sha256Bytes =Utils.sha256(publicKey);

  3. System.out.println("sha256加密="+Utils.bytesToHexString(sha256Bytes));

  4.        RIPEMD160Digest digest =new RIPEMD160Digest();

  5.        digest.update(sha256Bytes,

    相關推薦

    使用Java生成錢包地址過程

    比特幣錢包地址的生成過程第一步,通過OpenSSL命令隨機生成金鑰對生成橢圓曲線的私鑰opens

    如何在Java生成錢包地址

    讓我們通過學習比特幣(Bitcoin)如何實施該技術的各個方面來工作,好嗎?該技術包括以下幾個方面: 交易transaction是比特幣從一個地址轉移到另一個地址。 幾個交易被分組成一個區塊block。一個區塊被處理,因此它可以被提交到比特幣網路中。這個過程被稱為挖礦

    使用PHP從擴充套件公鑰生成錢包地址

    重複使用相同的比特幣錢包地址是一個很大的隱私問題。如果你有一個簡單的電子商店或要求捐贈的網站,你可能需要考慮為每筆交易生成唯一的地址。 有很多支付系統,如Bitpay,為你完成所有艱苦的工作。缺點是他們需要使用你的私鑰。但是,你可以使用來自分級確定性(hierarchically det

    錢包地址的概念以及SHA256和橢圓曲線乘法加密演算法的詳解

    比特幣錢包,金鑰,地址 錢包就是金鑰所在之處,錢包是私鑰的容器,通過有序檔案或者簡單的資料庫實現或者用原有的私鑰通過單向雜湊函式生成每一個新的私鑰,並將新的金鑰順序連線。 比特幣錢包包含的是私鑰而不是比特幣,一個使用者可以有一個或者多個私鑰的錢包,錢包中含有成對的私鑰和公鑰

    Java解析錢包交易記錄

    可以通過比特幣錢包命令匯出相關的交易記錄,如果你想統計某個地址或者某個使用者的交易時,可以解析該檔案。技術很簡單,因為匯出檔案為JSON格式,這裡通過alibaba的fastjson來解析。首先,通過命令匯出最近兩條交易記錄:?1./cli listtransactions 

    go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成地址過程講解、base58實現

    go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成比特幣地址過程講解、BASE58實現 前言 本文主要講解使用Go的ecdsa庫實現橢圓曲線加解密、簽名、驗證演算法,同時通過公鑰生成比特幣地址,具體程式碼邏輯參考bitcoin0

    [轉]【錢包開發 五】新建錢包生成子賬號地址與路徑

    本文轉自:https://www.chaindesk.cn/witbook/9/74 課程目標掌握連線到比特幣正式網路與測試網進行開發學會建立錢包與備份錢包生成賬號地址前言比特幣的賬號是通過bip協議生成種子,然後擴充套件成多個子地址,這些子地址都由同一個種子可以推匯出來,而知道其中一個子賬號的私鑰不能推導

    Java建立地址

    如果你希望在自己的桌面Java應用、Web應用或者手機安卓應用中整合對比特幣 支付的支援,例如,離線生成比特幣私鑰和地址、接收比特幣支付、多重簽名轉賬、 查詢錢包餘額等,那麼使用bitcoinj這個超高人氣的Java比特幣開發庫,將會 極大地提高你的開發效率。 在Java應用中整合比特幣支援能力

    golang[38]-區塊鏈- 生成地址

    生成比特幣地址 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707

    Openssl實現生成地址的base58編碼

    比特幣協議中比特幣地址的生成演算法如下: 比特幣地址(Bitcoin Address)是ECDSA公鑰(public key)的雜湊,它是這樣計算出來的: Version = 1 個位元組 0

    【區塊鏈入門】十分鐘讀懂錢包與轉賬過程

    如何 pla ddr 速度 tar 不用 新建 一分鐘 sim 比特幣錢包到底是什麽? 大家可能知道比特幣就是區塊鏈上的一個賬本。那我們先來看一個,它到底長什麽樣? 因為比特幣的賬本是完全公開的,所以我們隨便找一個錢包地址,看一下: 1DrtPCLLBbeBwHKPKfg

    家園|價格|錢包下載

    2016年 優勢 家園 bsp 自己的 過去 四種 自動 世界 Den German(IRS總裁)說《只有懶惰與不夠自信態度是在您致富的道路上產生最大的障礙》。國際儲備體--是一家全新的運營公司。如果您確定好了參與IRS,如果願意花自己的時間為了主動地發展與宣傳I

    的交易過程

    img 步驟 結束 限制 下一個 本地存儲 16px 提高 一個人 一、區塊鏈 區塊鏈是比特幣實現的一個基礎技術,所以先講講區塊鏈的概念~ 簡單的來說,區塊鏈是一種“去中心”的分布式數據庫。 傳統的數據庫像如下圖一樣,數據都存放在一個地方: 區塊鏈是每個用戶都存一份數據(

    Electrum錢包的Python程式碼分析

    如果你仍然未對Python語言的強大功能感到驚訝,那麼在這部分我們將學習如何在python中開發比特幣地址或錢包。我只是想說與你的計算機通訊是多麼容易,如果你通過python和Linux作業系統,可以用它做多少有趣的專案。 在本文中,我將分析Electrum的原始碼,這是純粹用Pytho

    錢包開發

    本章主要內容有:比特幣地址和比特幣地址生成、位元私鑰生成、比特幣交易簽名,傳送比特幣交易到區塊鏈網路。 一.比特幣的地址 1.比特幣地址字首 基於區塊鏈的貨幣使用編碼字串,這些字串採用Base58Check編碼,但Bech32編碼除外。 編碼包括字首(傳統上是單個版本位元組)

    錢包RPC的PHP呼叫方法

    當我們希望在Php開發的網站中加入比特幣支付功能時,需要解決的第一個 問題,就是如何在Php程式程式碼中呼叫比特幣錢包的RPC API開發介面來實現 我們期望的功能,例如比特幣的支付與接收。 例如,當我們希望在Php程式碼中給某個比特幣地址傳送以太幣時,可以使用 sendtoaddress 這個

    Php訪問錢包的RPC介面

    當我們希望在Php開發的網站中加入比特幣支付功能時,需要解決的第一個 問題,就是如何在Php程式程式碼中呼叫比特幣錢包的RPC API開發介面來實現 我們期望的功能,例如比特幣的支付與接收。 例如,當我們希望在Php程式碼中給某個比特幣地址傳送以太幣時,可以使用

    打造屬於自己的錢包

    背景 為了能夠順利地讀懂本文,您需要有一點C#程式設計經驗並且熟悉NBitcoin。當然如果你研究過Bitcoin C# book就更好了。 設計選擇 我們希望打造一個跨平臺的錢包,所以.NET Core是我們的首選。我們將使用NBitcoin比特幣庫,因為它是目前為止

    錢包高階功能使用命令

    31 getreceivedbyaddress 取得地址收款金額 ★★★ 地址 <bitcoinaddress> [minconf=1] 返回指定地址<bitcoinaddress>上收到至少[minconf]個確認的收款交易總金額。雖然有些人可能會認為這很明顯,返回值只統計該地址的收

    如何獲取和使用錢包?一分鐘就可搞定!

    比特幣錢包的功能其實就像實物錢包一樣,裡面可以儲存你的比特幣資訊,包括比特幣地址(類似於你的銀行卡賬號)、私鑰(類似於你銀行卡的密碼),而且比特幣錢包還分為冷錢包,熱錢包等,其實也就是私鑰的儲存方式不同。為了方便礦友們使用,在這裡推薦兩款線上錢包(熱錢包) blockchain,Coinbase。