为什么 EOS 私钥有不同长度?

sw
问题

这里有两个EOS私钥,它们长度居然不一样?

PVT_K1_1EEr5aW5162skbocDSMDgoWn9jna6HPSr1TwEMR6PNXbPtRky

PVT_K1_2bfGi9rYsXQSXXTvJbDAPhHLQUojjaNLomdm3cEJ1XTzMqUt3V

为什么私钥有不同长度?而公钥就都是固定长度呢?

知识点

私钥是一个大型随机数,而公钥则是私钥乘以椭圆曲线上的基点后对应的点。对于secp256k1来说,是256位,并且n的整数。

n须为质数,OrderofG,是使得n*G=0的最⼩正整数,n是安全性最⼤的决定因素。对于secp256k1来说,n=0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141。

不是每个数都安全,比如小的数肯定是不安全的,黑客可以从1开始枚举,不够大的数很快就被找到对应关系,也可以从n倒着枚举,所以太大的也不安全。(PS:临近一些特别数的数也不安全……)一般来说,私钥的安全范围是[0x000000000000000000000000000000000000000000000000000000,0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff]。

工具

使用可以把私钥转为它代表的数字:

DEBUG=*_K1_1EEr5aW5162skbocDSMDgoWn9jna6HPSr1TwEMR6PNXbPtRky

secp256k1-tools:key-utilpvt=84ade57e2b35cca8972562fcc6d1f6f2fbf078c4f2cfb532eb4d740767c5a8+0ms

secp256k1-tools:key-utilx=2110b8d675240f5d548d166cc06b22f44c671d762711a3a67027b74cd166ab76+9ms

secp256k1-tools:key-utily=20ac68b75ad8b0e4bc3ec5705ebaf57c69d2d8268504d6aa95fdebfd0b7db831+0ms

PVT_K1_1EEr5aW5162skbocDSMDgoWn9jna6HPSr1TwEMR6PNXbPtRky

PUB_K1_75o92oRgWSgx3XzTDYPj1e3hFSRhMnKaUdW8ZZpxJXkhfiGBHS

DEBUG=*_K1_2bfGi9rYsXQSXXTvJbDAPhHLQUojjaNLomdm3cEJ1XTzMqUt3V

secp256k1-tools:key-utilpvt=d2653ff7cbb2d8ff129ac27ef5781ce68b2558c41a74af1f2ddca635cbeef07d+0ms

secp256k1-tools:key-utilx=c0ded2bc1f1305fb0faac5e6c03ee3a1924234985427b6167ca569d13df435cf+8ms

secp256k1-tools:key-utily=eeceff7130fd352c698d2279967e2397f045479940bb4e7fb178fd9212fca8c0+1ms

PVT_K1_2bfGi9rYsXQSXXTvJbDAPhHLQUojjaNLomdm3cEJ1XTzMqUt3V

PUB_K1_6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5BoDq63

分析1.数值比较

PVT_K1_1EEr5aW5162skbocDSMDgoWn9jna6HPSr1TwEMR6PNXbPtRky,有56个字符,去掉前缀和校验码后有45个字符,它代表0x84ade57e2b35cca8972562fcc6d1f6f2fbf078c4f2cfb532eb4d740767c5a8;

PVT_K1_2bfGi9rYsXQSXXTvJbDAPhHLQUojjaNLomdm3cEJ1XTzMqUt3V,有57个字符,去掉前缀和校验码后有46个字符,,它代表d2653ff7cbb2d8ff129ac27ef5781ce68b2558c41a74af1f2ddca635cbeef07d。

可以清楚地看出前者短一个字符,数值也相应比较小。

2.BASE58编码的原理

BASE58的字符集:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz,其中'1'代表0,'z'代表57。把待编码的数字不断除以58,并将余数用对应的字符表示。举个小点的数字做例子:618

618/58=10..38-f

10/58=0..10-B

拼接余数得fB,再反转得Bf。

3.BASE58编码位数关系

一个数编码后,应该长于或等于比它小的数。我们可以通过简单的数学计算得出45个字符的BASE58编码可以表示的最大数:

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=0xc33ed2d1fbdd3bfe9c22b96164d38cf0d640e1c0ee8b61c39c57899fffffffffff

所以=0xc33ed2d1fbdd3bfe9c22b96164d38cf0d640e1c0ee8b61c39c57899fffffffffff的私钥编码后是56个字符;大于者59个字符。

4.旧格式私钥

旧格式私钥:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

对应新格式:PVT_K1_2bfGi9rYsXQSXXTvJbDAPhHLQUojjaNLomdm3cEJ1XTzMqUt3V

同理,只是格式不同罢了。不再展开。

5.为什么公钥是固定长度呢?

因为公钥有个表示奇偶性的前缀,0x02或者0x03,所以它的大小范围被限定,没能相差一个BASE58字符。

相关文章

基于ECC的私钥转为公钥的过程

文章版权声明:除非注明,否则均为机床资讯库原创文章,转载或复制请以超链接形式并注明出处。

上一个 自组公路车,车店师傅不会告诉你的十大注意和技巧(上)

下一个 中企承建科特迪瓦可可加工厂正式交付