文档章节

如何在Java中生成比特币钱包地址

geek12345
 geek12345
发布于 10/23 09:16
字数 1852
阅读 317
收藏 7

让我们通过学习比特币(Bitcoin)如何实施该技术的各个方面来工作,好吗?该技术包括以下几个方面:

  • 比特币地址bitcoin address是用来发送和接收比特币的。
  • 交易transaction是比特币从一个地址转移到另一个地址。
  • 几个交易被分组成一个区块block。一个区块被处理,因此它可以被提交到比特币网络中。这个过程被称为挖矿mining
  • 区块被收集在区块链blockchain中,并由网络中的节点共享。

警告的提示——这里的代码仅用于学习。如果你试图将比特币发送到由该代码生成的地址,你可能会损失金钱。

什么是比特币地址?

比特币地址是一个随机查找的十六进制字符串,在比特币网络中用于发送和接收比特币。它是公私不对称ECDSA密钥的公共部分。相应的私钥用于签署比特币交易,作为交易时来自你的确认和证明。

从技术上讲,比特币地址是从ECDSA密钥的公共部分生成的,使用SHA-256RIPEMD-160进行hash,如下文所述,处理得到的结果hash,最后使用Base58校验编码对密钥进行编码。

让我们看看如何使用JCE(java加密扩展)Bouncy Castle(RIPEMD-160)以及最后在bitcoinj库中使用Base58编码功能来完成所有这些工作。

生成ECDSA密钥对

我们之前已经介绍过生成RSA公钥和私钥。比特币使用ECDSA代替RSA作为关键算法。它生成如下:

Elliptic Curve算法创建KeyPairGenerator

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

使用指定椭圆曲线是secp256k1。

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

一旦获得KeyPairGenerator后,你可以创建KeyPair即密钥对,从中可以获取公钥和私钥。

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

ECDSA私钥

你可以只存储密钥的私有部分,因为公钥可以从私钥派生。

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

静态方法adjustTo64()仅填充带有前导0的十六进制字符串,因此总长度为64个字符。

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

这个值通常是由数字钱包存储的值。

ECDSA公钥

上面生成的密钥的公共部分被编码为比特币地址。首先,ECDSA密钥由椭圆曲线上的点表示。该点的X和Y坐标包括公钥。它们在开头与“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

执行SHA-256和RIPEMD-160哈希

我们现在需要在公钥上执行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提供程序来执行RIPEMD-160,因为JCE没有实现此算法。

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

接下来,我们需要在哈希开头添加一个0x00的版本字节。

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

重复SHA-256哈希两次

我们现在需要对上面的结果执行两次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());

第二次散列结果的前4个字节用作地址校验和。它附加到上面的RIPEMD160哈希。这是25字节的比特币地址。

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对地址进行编码

我们现在使用bitcoinj库中的Base58.encode()方法来获得最终的比特币地址。

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

这是比特币应在交易中发送到的地址。

这是一个如何在java中生成比特币地址的演示文稿。我们生成一个ECDSA密钥对,使用SHA256RIPEMD160哈希密钥的公共部分。最后,我们通过执行SHA256两次并选取前4个字节来计算校验和,该字节附加到上面的RIPEMD160哈希。结果使用Base58编码进行编码。

觉得有点复杂,也可以看这个Java离线生成比特币地址

建议你浏览我们汇智网的各种编程语言的区块链教程和区块链技术博客,更深入了解区块链,比特币,加密货币,以太坊,和智能合约。

  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。

汇智网原创翻译,转载请标明出处。这里是原文

© 著作权归作者所有

共有 人打赏支持
geek12345
粉丝 19
博文 59
码字总数 124030
作品 0
海淀
私信 提问
Java如何离线生成比特币地址

如果你希望在自己的桌面Java应用或者手机安卓应用中集成对比特币 支付的支持,例如,离线生成比特币私钥和地址、接收比特币支付、多重签名转账、 查询钱包余额等,那么使用bitcoinj这个超高人...

编程狂魔
10/08
0
0
iOS和Android比特币开发3个最受欢迎的应用SDK(示例)

如今的比特币不仅是加密货币还是数字支付系统。实际上,由于其独特的功能,比特币已成为投资,储蓄甚至赚取更多钱的真正工具。在本文中,我们想谈谈3个最受欢迎的比特币应用SDK,它可以帮助您...

笔阁
10/17
0
3
如何用Python为以太坊和比特币生成vanity地址

今天,我们将编写一个非常简单的python脚本来生成虚荣地址,这些地址是以某个短语或字母序列开头的加密货币地址。该过程涉及生成私钥并检查目标短语的地址,直到找到满意的地址。 安装包 首先...

笔阁
11/05
0
0
6个应当了解的Java比特币开源项目

比特币是第一种被广泛认可并获得众多支持的数字加密货币,如果你考虑在自己的Java系统中增加对比特币的支持,那么相信下面这6个使用Java开发的比特币开源项目会对你所帮助: 1、bitcoinj 代码...

汇智网教程
10/04
0
0
6个你应当了解的Java比特币项目

比特币是第一种被广泛认可并获得众多支持的数字加密货币,如果你考虑 在自己的Java系统中增加对比特币的支持,那么相信下面这6个使用Java开发 的比特币开源项目,会对你有很大的帮助。 1、b...

编程狂魔
10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux虚拟机安装VmwareTool

1.点击虚拟机: 2.点击安装Vmware-Tools,出现如下界面,将圈起来的拖动到桌面 3.接着打开终端,执行解压缩命令 tar -xzv -f VMwareTools-10.2.5-8068393.tar.gz 这个后面的VMwareTools-10.2....

陈刚生
38分钟前
1
0
Java学习笔记(1) --JSE 、JEE、 JME三者的区别

java SE : java standard edition , JSE。它允许允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的java应用程序。 java SE包含了java Web 服务开发的类,并为java platform ,e...

hellation_
40分钟前
3
0
kafka 环境配置

https://www.cnblogs.com/fly-piglet/p/7762556.html

steel7c4
44分钟前
1
0
关于人工智能的思考

像人类一样可以思考,可以创造的人工智能会出现吗? 个人认为:会出现。但是出现的时间,取决了于硬件架构,和运算架构实现的时候。原因在于,人类智能可以出现,机器智能为什么不可以呢,不...

janl
45分钟前
1
0
破界!Omi生态omi-mp发布,用小程序开发生成Web

omi-mp 是什么 Omi 框架是微信支付线研发部和 AlloyTeam 开源的通用 Web 组件化框架,基于 Web Components,用来开发 PC、手机浏览器或者微信、手Q webview 的 Web 页面。自今年5月开源以来,...

腾讯开源
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部