您现在的位置是:首页 > 新兴行业 > 大数据大数据

生成比特币钱包地址java示例(动态生成)

2021-05-10 19:21:34大数据人已围观

简介地址是一个随机查找的十六进制字符串,在比特币网络中用于发送和接收比特币。它是公私不对称ECDSA密钥的公共部分。相应的私钥用于签署比特币交易,作为交易时来自你的确认和证明那么每个用户都有不同的地址,就需要我们动态生成了,网上有很多用 openssl工具来生成的,可以是可以,但是应用的时候也不能手动为每一个用户生成对吧所以全部用代码生成全代码以及释义如下 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");



地址是一个随机查找的十六进制字符串,在比特币网络中用于发送和接收比特币。它是公私不对称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

文章来源:https://blog.csdn.net/Goligory/article/details/116522263

Tags:比特币 比特币钱包 钱包地址 区块链 加密解密 

很赞哦! ()

上一篇:2021-05-07

下一篇:区块链之旅(一)

随机图文

文章评论

留言与评论(共有 0 条评论)
   
验证码:

本栏推荐

站点信息

  • 文章统计247968篇文章
  • 浏览统计18329次浏览
  • 评论统计1个评论
  • 标签管理标签云
  • 统计数据:统计代码
  • 微信公众号:扫描二维码,关注我们