如何生成公私钥对

GXChain的私钥(PrivateKey)是一个随机大整型(Random BigInteger),而公钥是ECC(椭圆曲线密码学)上的G和PrivateKey的乘积,代表着椭圆曲线上的一个点。和大多数区块链系统一样,GXChain的公私钥对是建立在secp256k1这个曲线上的,私钥p和公钥P的关系表达为:

P = secp256k1.G.multiply(p)

BIP39和助记词

BIP39是比特币优化提案第0039号提案,其内容为定义一种通过助记词生成私钥的方案,解决私钥难以通过文本方式记录的问题,其方法是通过获取字典中的一系列随机单词来作为私钥生成的seed。GXChain的助记词是由16个随机单词组成的,示例如下:

truvat amyrin cuss tulare redcoat reckla arratel cladose deedbox receipt overwin quasi kan bout joe rompish

私钥

如文章开头所描述,GXChain的私钥本质是一个BigInteger,而助记词m和私钥p的关系是

p = sha256(sha512(m+' '+i));

Tips

其中i为sequence,通过改变i,一个助记词就可以生成多把私钥

为了保证复制过程中不小心遗漏,私钥由版本号(固定值0x80)、私钥p本身、checksum(2次sha256编码的私钥)三部分组成,表达为

p' = Base58(Buffer.concat([0x80, p, sha256(sha256(p)).slice(0,4)]))

为了方便复制,以及用更短的文本进行表达,我们通过Base58的方式对以上三部分进行编码,称为钱包导入格式(Wallet Import Format),简称WIF,示例如下:

5JrWo7xtBXSQybihT9wmepNxaNyxMyETPiUSAVMdEBEmotwocS4

公钥

如文章开头提到,公钥和私钥的关系是

P = secp256k1.G.multiply(p)

同样,为了方便复制和防止复制遗漏,采用以核心资产标识符GXC为前缀,以RIPEMD160计算的checksum为后缀,并以Base58的方式对公钥和checksum部分进行编码,表达为:

P' = GXC+Base58(Buffer.concat([P,ripemd160(p).slice(4)]))

示例:

GXC8jfLPQcaNEzz1HGL5pHPzM7ZPuDKaCLiiXxTkU7ec63WDoJQiL

参考文献

参考代码

Python:

Go:

Elixir:

Objective-C:

Haskell:

.NET C# (PCL):

.NET C# (PCL):

JavaScript:

Ruby:

Rust:

Swift:

C++:

C (with Python/Java/Javascript bindings):

上次更新: 2019-2-15 17:59:10