Filecoin钱包地址私钥离线生成

本文详细阐述了如何通过随机生成私钥,运用椭圆曲线算法和BLAKE2b算法生成和验证钱包地址的过程,包括公钥哈希、校验和计算以及Base32编码,重点讲解了BLAKE2b在Filecoin中的角色和其安全性特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、地址及私钥生成步骤

1、随机生成256位私钥

2、利用椭圆曲线加密算法生成公钥

3、将公钥前加入0x04值后,进行20位的blake2b计算

4、将得到的blake2哈希值前添加0x01后,继续用blake2b算法计算4位校验和。

5、将20位公钥哈希值和4位校验和连接起来,并用遵照RFC4648标准的Base32编码格式进行编码。

6、将编码后的字符串根据地址属性,属于测试网(t),还是正式网(f),是钱包地址(1)还是合约地址(2)加上相应的前缀。得到最终地址

二、blake2b算法详解

a)在Filecoin区块链中 blake2b 使用在以下一些地方:

1、blake2b-256 :IPLD,用于区块和消息

2、blake2b-4 :用于校验

3、black2b-160:用于取代RIPEMD-160来生成 secp256k1 地址

b)blake2b算法

    Blake2是一个强调快速、安全与简单的Hash算法,并且目前被用来替代MD5和SHA1。因为它可以在不耗费更多资源的情况下提供更好的安全性

          常见的哈希算法有 MD5, SHA-1, SHA-2, SHA-3。

          BLAKE2 系列比常见的 MD5,SHA-1,SHA-2,SHA-3 更快,同时提供不低于 SHA-3 的安全性。 BLAKE2的定位是目前安全系数最高的哈希函数。

       BLAKE2是基于BLAKE实现的,BLAKE2有两大主要版本:BLAKE2b和BLAKE2s。BLAKE2b是BLAKE的64位版本,它可以生成最高512位的任意长度哈希。BLAKE2s是BLAKE的32位版本,它可以生成最高256位的任意长度哈希。BLAKE2x是对BLAKE2的简单扩展,它可以生成任意长度的哈希值(长度不受限制)

三、代码实现

public static WalletAddress createWallet(){
        ECKey ecKey = new ECKey();
        //返回包含私钥的32字节数组
        byte[] privKeyBytes = ecKey.getPrivKeyBytes();
        //获取编码的公钥值。
        byte[] pubKey = ecKey.getPubKey();
        if (privKeyBytes == null || privKeyBytes.length < 1) {
            System.out.println("密钥生成失败");
        }
        String filAddress = byteToAddress(pubKey);
        String privateKey = HexUtil.encodeHexStr(privKeyBytes);
        return new WalletAddress(privateKey,filAddress);
    }
    private static String byteToAddress(byte[] pub) {
        Blake2b.Digest digest = Blake2b.Digest.newInstance(20);
        String hash = HexUtil.encodeHexStr(digest.digest(pub));
        //将得到的blake2哈希值前添加0x01
        String pubKeyHash = "01" + HexUtil.encodeHexStr(digest.digest(pub));
        //用blake2b算法计算4位校验和
        Blake2b.Digest blake2b3 = Blake2b.Digest.newInstance(4);
        String checksum = HexUtil.encodeHexStr(blake2b3.digest(HexUtil.decodeHex(pubKeyHash)));
        //Base32编码
        return "f1" + Base32.encode(HexUtil.decodeHex(hash + checksum)).toLowerCase();
    }

    public static void main(String... args) {
        WalletAddress walletAddress = createWallet();
        System.out.println("地址="+walletAddress.getAddress());
        System.out.println("私钥="+walletAddress.getPrivateKey());
    }

代码运行结果:

钱包充提系统

学如逆水行舟,不进则退。心似平原跑马,易放难收。【区块链】【系统/网络/运维】【云计算/大数据】【数据库】【移动开发】【后端开发】【游戏开发】【UI设计】【微服务】【爬虫】【Java】【Go】【C++】【PHP】【Python】【Android/IOS】【HTML/CSS】【JavaScript】【Node】【VUE】【ReactNaive】。。。

欢迎各位大神萌新一起专研分享各行各业技术!

Chain区块链开发社区:593674370

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值