生成比特币钱包地址java示例(动态生成)
Posted 东北_老乡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成比特币钱包地址java示例(动态生成)相关的知识,希望对你有一定的参考价值。
地址是一个随机查找的十六进制字符串,在比特币网络中用于发送和接收比特币。它是公私不对称ECDSA密钥的公共部分。相应的私钥用于签署比特币交易,作为交易时来自你的确认和证明
那么每个用户都有不同的地址,就需要我们动态生成了,网上有很多用 openssl工具来生成的,可以是可以,但是应用的时候也不能手动为每一个用户生成对吧
所以全部用代码生成
全代码以及释义如下
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
//使用指定椭圆曲线是secp256k1
ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");
keyGen.initialize(ecSpec);
KeyPair kp = keyGen.generateKeyPair();
PublicKey pub = kp.getPublic();
PrivateKey pvt = kp.getPrivate();
ECPrivateKey epvt = (ECPrivateKey) pvt;
String sepvt = adjustTo64(epvt.getS().toString(16)).toUpperCase();
System.out.println("s[" + sepvt.length() + "]:私钥 " + sepvt);
ECPublicKey epub = (ECPublicKey) pub;
ECPoint pt = epub.getW();
//ECDSA密钥由椭圆曲线上的点表示。该点的X和Y坐标包括公钥。它们在开头与“04”连接在一起代表公钥
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 length:" + bcPub.length() + ":公钥 " + bcPub);
byte[] publicKey = new BigInteger(bcPub, 16).toByteArray();
//1 对公钥进行SHA-256加密
byte[] sha256Bytes = Utils.sha256(publicKey);
System.out.println("sha256加密=" + Utils.bytesToHexString(sha256Bytes));
//2 使用RIPEMD160加密
RIPEMD160Digest digest = new RIPEMD160Digest();
digest.update(sha256Bytes, 0, sha256Bytes.length);
byte[] ripemd160Bytes = new byte[digest.getDigestSize()];
digest.doFinal(ripemd160Bytes, 0);
System.out.println("ripemd160加密=" + Utils.bytesToHexString(ripemd160Bytes));
//3 将版本号添加到上述加密结果之前,变成21位
byte[] networkID = new BigInteger("00", 16).toByteArray();
byte[] extendedRipemd160Bytes = Utils.add(networkID, ripemd160Bytes);
System.out.println("添加NetworkID=" + Utils.bytesToHexString(extendedRipemd160Bytes));
//4 再次sha256加密
byte[] twiceSha256Bytes = Utils.sha256(Utils.sha256(extendedRipemd160Bytes));
System.out.println("两次sha256加密=" + Utils.bytesToHexString(twiceSha256Bytes));
//5 将两次SHA-256加密后的结果取前4bytes,作为地址的checksum
byte[] checksum = new byte[4];
System.arraycopy(twiceSha256Bytes, 0, checksum, 0, 4);
System.out.println("checksum=" + Utils.bytesToHexString(checksum));
//6 将checksum加到第3步结果后面,生成25位地址
byte[] binaryBitcoinAddressBytes = Utils.add(extendedRipemd160Bytes, checksum);
System.out.println("添加checksum之后=" + Utils.bytesToHexString(binaryBitcoinAddressBytes));
//7 使用base58编码生成比特币的钱包地址
String bitcoinAddress = Base58.encode(binaryBitcoinAddressBytes);
System.out.println("bitcoinAddress=" + bitcoinAddress);
借鉴:
https://www.e-learn.cn/topic/853057
https://www.imooc.com/article/23852
以上是关于生成比特币钱包地址java示例(动态生成)的主要内容,如果未能解决你的问题,请参考以下文章