生成比特币钱包地址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示例(动态生成)的主要内容,如果未能解决你的问题,请参考以下文章

比特币隔离见证钱包地址计算

比特币相关文档备案

BTC比特币HD钱包开发教程1|简单知识

区块链学习钱包

求教,比特币钱包怎么与php建立连接

钱包开发 - USDT - 三nodejs版本