LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资讯 > EOS密码学:EOS公钥的生成过程

EOS密码学:EOS公钥的生成过程

2020-06-10 松果 来源:区块链网络


之前的文章介绍了私钥的生成过程和公钥的生成原理,示例EOS私钥(16进制表示)为

a3370527cf8b72e5833f5990531dda218c30adb73587ee2d5debd179ec22da8b

Base58编码后的WIF格式为

5K4AgqVQY98vCYtPK9xbT99ui3FgLFp3j5Vso1dFuVmaVPuppD2

这篇文章介绍从私钥生成EOS公钥的过程。

使用secp256k1标准计算压缩格式公钥

EOS公钥的生成使用的是secp256k1标准的椭圆曲线算法,且生成的是压缩格式的公钥。

可以用Python程序来计算(用16进制的原始私钥进行运算,不是WIF格式私钥)

from ecdsa import SigningKey, SECP256k1 private_key = 'a3370527cf8b72e5833f5990531dda218c30adb73587ee2d5debd179ec22da8b' sk = SigningKey.from_string(bytes.fromhex(private_key), curve=SECP256k1) vk = sk.get_verifying_key() x = vk.to_string()[:32] y = vk.to_string()[32:] if y[-1] % 2 == 0: prefix = b'\x02' else: prefix = b'\x03' print((prefix + x).hex())

运算结果为

03360c18aab0eabbd8b6b26ca8032c693ed1aab28da6eb1d0472eabd8e21233816

这个33字节的16进制数就是压缩格式的公钥,由前缀0x03和椭圆曲线上一点的x坐标构成,且这个点的y坐标为奇数,所以使用03作为前缀。

从压缩格式公钥生成EOS公钥

上一步生成的压缩格式公钥要变成平时见到的EOS公钥(地址),还需经过以下步骤。

1、ripemd160哈希运算,Python代码如下

import hashlib public_key = '03360c18aab0eabbd8b6b26ca8032c693ed1aab28da6eb1d0472eabd8e21233816' h = hashlib.new('ripemd160') h.update(bytes().fromhex(public_key)) print(h.digest().hex())

结果为一个20字节的16进制数

91c0d18cdc236906575816f05d45379e3dc01ef5

2、取上一步结果值的前4字节作为校验码(checksum)

91c0d18c

3、拼接压缩格式公钥和校验码(37字节)

03360c18aab0eabbd8b6b26ca8032c693ed1aab28da6eb1d0472eabd8e2123381691c0d18c

4、对上一步结果进行base58编码(50个字符)

7F36SKLm2toCBrA9DWV8UHeNLpSwAW2DWYLejcSoFvrrbG3hWT

5、加上前缀EOS(53个字符)

EOS7F36SKLm2toCBrA9DWV8UHeNLpSwAW2DWYLejcSoFvrrbG3hWT

现在得到了熟悉的EOS公钥(地址),整个过程用Python实现如下

import hashlib import base58 public_key = '03360c18aab0eabbd8b6b26ca8032c693ed1aab28da6eb1d0472eabd8e21233816' h = hashlib.new('ripemd160') h.update(bytes().fromhex(public_key)) checksum = h.digest()[:4] address = 'EOS' + base58.***encode(bytes().fromhex(public_key) + checksum).decode() print(address)

—-

编译者/作者:松果

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...