web3动态
私钥
来源:     阅读:261
网站管理员
发布于 2025-12-25 02:09
查看主页

在比特币中,私钥本质上就是一个256位的随机整数。我们以JavaScript为例,演示如何创建比特币私钥。

在JavaScript中,内置的Number类型使用56位表示整数和浮点数,最大可表示的整数最大只有9007199254740991。其他语言如Java一般也仅提供64位的整数类型。要表示一个256位的整数,可以用数组来模拟。bitcoinjs使用bigi这个库来表示任意大小的整数。

下面的代码演示了通过ECPair创建一个新的私钥后,表示私钥的整数就是字段d,我们把它打印出来:

注意:每次运行上述程序,都会生成一个随机的ECPair,即每次生成的私钥都是不同的。

256位的整数通常以十六进制表示,使用toHex(32)我们可以获得一个固定64字符的十六进制字符串。注意每两个十六进制字符表示一个字节,因此,64字符的十六进制字符串表示的是32字节=256位整数。

想要记住一个256位的整数是非常困难的,并且,如果记错了其中某些位,这个记错的整数仍然是一个有效的私钥,因此,比特币有一种对私钥进行编码的方式,这种编码方式就是带校验的Base58编码

对私钥进行Base58编码有两种方式,一种是非压缩的私钥格式,一种是压缩的私钥格式,它们分别对应非压缩的公钥格式和压缩的公钥格式。

具体地来说,非压缩的私钥格式是指在32字节的私钥前添加一个0x80字节前缀,得到33字节的数据,对其计算4字节的校验码,附加到最后,一共得到37字节的数据:

0x80           256bit             check ┌─┬──────────────────────────────┬─────┐ │1│              32              │  4  │ └─┴──────────────────────────────┴─────┘

计算校验码非常简单,对其进行两次SHA256,取开头4字节作为校验码。

对这37字节的数据进行Base58编码,得到总是以5开头的字符串编码,这个字符串就是我们需要非常小心地保存的私钥地址,又称为钱包导入格式:WIF(Wallet Import Format),整个过程如下图所示:

Uncompressed WIF

可以使用wif这个库实现WIF编码:

另一种压缩格式的私钥编码方式,与非压缩格式不同的是,压缩的私钥格式会在32字节的私钥前后各添加一个0x80字节前缀和0x01字节后缀,共34字节的数据,对其计算4字节的校验码,附加到最后,一共得到38字节的数据:

0x80           256bit           0x01 check ┌─┬──────────────────────────────┬─┬─────┐ │1│              32              │1│  4  │ └─┴──────────────────────────────┴─┴─────┘

对这38字节的数据进行Base58编码,得到总是以KL开头的字符串编码,整个过程如下图所示:

Compressed WIF

通过代码实现压缩格式的WIF编码如下:

目前,非压缩的格式几乎已经不使用了。bitcoinjs提供的ECPair总是使用压缩格式的私钥表示:

小结

比特币的私钥本质上就是一个256位整数,对私钥进行WIF格式编码可以得到一个带校验的字符串。

使用非压缩格式的WIF是以5开头的字符串。

使用压缩格式的WIF是以KL开头的字符串。


免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 web3动态
相关推荐
离开币圈,转投AI,真的是人间清醒吗?
美国为什么拥抱加密?答案或许在37万亿美元巨额债务中
俄罗斯拟在布里亚特共和国南部和外贝加尔边疆区实施全年永久性加密挖矿禁令
全球稳定币监管成型 可在自贸区试点“中国方案”
算力波动或下降了怎么办?