l 问题描述:
比特币钱包负责管理私钥,在收款时往往会展示钱包地址。钱包地址的生成步骤如下(如图所示):
获取私钥对应的公钥,再根据公钥计算公钥哈希值(ripemd160函数),得到一个20字节长度的字节数组;
1.在公钥哈希值前面添加比特币地址版本号(1个字节,当前默认为0x00);
2.对步骤1得到的数据进行两次SHA—256哈希操作(先计算哈希,再把结果作为输入再计算哈希),然后取结果的前4个字节作为校验和;
3.将步骤1和步骤2得到的结果拼接在一起,得到一个字节数组(25个字节长度,0x00+公钥哈希+校验和);
4.使用Base58编码算法将步骤3中生成的字节数组进行编码。
图 一:比特币地址生成基本流程
比特币的Base58编码是一种用于表示比特币地址和其他数据的编码方式,它遵循以下步骤或规则:
(1)定义Base58字符集:比特币的Base58字符集由58个字符组成,去除了容
易混淆的字符(例如0、0、I、1等)和可能导致歧义的字符(例如+、/等)。
(2)将待编码的数据转换为大整数:将待编码的数据(比如字节数组)视为一个大整数。
(3)对数据进行连续除法和取余运算:将步骤(2)中的大整数不断进行除以58的运算,得到的商作为下一轮的被除数,而余数则作为Base58编码结果的一个字符。重复此步骤直到商为0。
(4)拼接Base58字符:将步骤(3)中得到的每个余数所对应的Base58字符拼接在一起,得到最终的Base58编码结果。
(5)处理前导零:如果原始数据中有前导零(即值为0的字节),则在Base58编码结果中添加相应数量的Base58字符1。
(6)反转编码结果:将步骤(4)得到的Base58编码序列进行反转,得到最终的Base58编码结果。
Base58编码字符集定义如下:BASE58_ALPHABET=
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghi jkmnopqrstuvwxyz"
l 要求:
完成题目对应的程序模板(BtcAddress)中的方法:String buildAddress(String pubKeyHashHex);
该方法的入口参数pubKeyHashHex为公钥的哈希值(20字节长度的字节数组),采用16进制Hex字符串表示(40长度的字符串)
最后输出结果为生成的钱包地址。
提示:程序模板中已提供SHA256标准算法,建议使用
l 样例:
n 样例1
输入:749caa98f63a077a9a02f3b742eff2b55e638fe1
输出:1Bdb4dDTKar3TLvrwAhtv37FeMALL8fJp8
标签:编码,字节,比特,步骤,Base58,地址,钱包,哈希 From: https://www.cnblogs.com/Alisa-zmj/p/18110193