LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 新闻观点 > EOS密码学:钱包导入格式(WIF)私钥的生成过程

EOS密码学:钱包导入格式(WIF)私钥的生成过程

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


大家一般使用钱包客户端(如TokenPocket)操作EOS账户,这就需要把EOS账户权限对应的私钥(Private Key)导入到钱包,一般导入Active权限的私钥。

这种可以导入到钱包的私钥格式称为Wallet Import Format(WIF)私钥,即钱包导入格式的私钥,WIF私钥的概念最早来自比特币

EOS的WIF私钥一般是这样的

5K4AgqVQY98vCYtPK9xbT99ui3FgLFp3j5Vso1dFuVmaVPuppD2

以数字5开头的51个字符的字符串。

加密货币的私钥

对于比特币、以太坊、EOS等加密货币,私钥实际上就是一串二进制数字,这串二进制数字的位数为256位。

生成一个比特币私钥在本质上与“在1到2^256之间选一个数字”无异,更准确地说,私钥可以是1 和n-1之间的任何数字,其中n是一个常数(n=1.158*10^77,略小于 2^256)。

EOS的密码学原理绝大部分采用了和比特币相同的各种加密算法。

随机生成256位二进制数

生成私钥的第一步,是随机生成一个256位的二进制数。

从编程的角度,一般是通过在一个密码学安全的随机源中取出一长串随机字节,对其使用sha256哈希算法进行运算,这样就可以方便地产生一个256位的数字。如果运算结果小于n-1,就有了一个合适的私钥。否则,就用另一个随机数再重复一次。

这里简单处理,使用网络上的伪随机数生成器生成一个256位的二进制数

1010001100110111000001010010011111001111100010110111001011100101100000110011111101011001100100000101001100011101110110100010000110001100001100001010110110110111001101011000011111101110001011010101110111101011110100010111100111101100001000101101101010001011

每8位(bit)二进制数为一个字节(byte),这是一个32字节的数据。

256位二进制数转为64位十六进制数

在密码学领域,二进制数一般会转换成十六进制数进行处理,因为每4位二进制数可以自然地转换成1位十六进制数。上面的二进制数每4位分段转换成十六进制如下

二进制十六进制1010a0011300113011170000001015......

最终转换成的十六进制数为

a3370527cf8b72e5833f5990531dda218c30adb73587ee2d5debd179ec22da8b

这一步可以使用Python的hex函数进行处理

python hex(int(s,2))


私钥的格式

EOS的加密算法主要来自于比特币,这里先介绍比特币私钥的两种格式:非压缩的私钥格式、压缩的私钥格式。

非压缩的私钥格式

在32字节的私钥前添加一个前缀字节(0x80),得到33字节的数据。 然后通过两次sha256哈希算法计算33字节数据的校验码(4字节),校验码作为后缀加到原私钥末尾,得到37字节的数据。


对这37字节的数据进行Base58编码,得到的WIF私钥总是以"5"开头。

压缩的私钥格式

在32字节的私钥前后添加一个前缀字节(0x80)和后缀字节(0x01),得到34字节的数据。然后通过两次sha256哈希算法计算34字节数据的校验码(4字节),校验码作为后缀加到原私钥末尾,得到38字节的数据。


对这38字节的数据进行Base58编码,得到的WIF私钥总是以"K"或"L"开头。

生成WIF私钥

EOS采用的是非压缩的私钥格式,给十六进制私钥添加前缀字节(0x80)后私钥变成

80a3370527cf8b72e5833f5990531dda218c30adb73587ee2d5debd179ec22da8b

数据增加一个字节,变为33字节。

对33字节的数据进行sha256哈希运算得到

f017c469c63da0524a273aee7557a3c238ee3f3360e82ba0e2799d5beafc129c

对上一步的结果再次进行sha256哈希运算得到

0a3f8a2df7096cb51c6816a65685813153aebf691fa11f12ad7e91072ee1f5d9

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

0a3f8a2d

把4字节的校验码加到33字节数据末尾,得到37字节数据

80a3370527cf8b72e5833f5990531dda218c30adb73587ee2d5debd179ec22da8b0a3f8a2d

对37字节数据进行Base58编码得到最终的WIF私钥

5K4AgqVQY98vCYtPK9xbT99ui3FgLFp3j5Vso1dFuVmaVPuppD2

以上过程可以使用Python来运算,代码如下

import hashlib import base58 s = 'a3370527cf8b72e5833f5990531dda218c30adb73587ee2d5debd179ec22da8b' s33 = b'\x80' + bytes().fromhex(s) checksum = hashlib.sha256(hashlib.sha256(s33).digest()).digest()[0:4] wif = base58.***encode(s33 + checksum) print("wif_private_key: ", wif)


—-

编译者/作者:松果

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

LOADING...
LOADING...