大家一般使用钱包客户端(如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位分段转换成十六进制如下
二进制 | 十六进制 |
---|---|
1010 | a |
0011 | 3 |
0011 | 3 |
0111 | 7 |
0000 | 0 |
0101 | 5 |
... | ... |
最终转换成的十六进制数为
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)
版权声明:项目均采集于互联网, 空投币 无法审核全面,且希望大家能赚钱,请谨慎切勿上当受骗!
温馨提示:★★★天上真会掉馅饼!天道酬勤,都是机会!不错过每个空投糖果!真假难以辨认,尽量0撸!