主页 > imtoken钱包下载地址 > 区块链公钥格式(解析比特币密钥的格式)

区块链公钥格式(解析比特币密钥的格式)

imtoken钱包下载地址 2023-11-20 05:07:43

公钥和私钥都可以有多种编码格式。 密钥以不同的格式编码后,虽然结果可能看起来不同,但密钥编码的数字并没有改变。 这些不同的编码格式主要是为了方便密钥的使用和识别而不会出错。

区块链公钥格式(解析比特币密钥的格式)

私钥格式

私钥可以用多种不同的格式表示,所有格式都对应于相同的 256 位数字。 .

私钥符号(编码格式)

型号版本说明

HexNone64 个十六进制数字

Base58Check编码:带版本的Base58

WIF5

128 位和 32 位校验和的前缀

WIF-compressedK 或 LAs 以上,在编码前添加后缀 0x01 表 4-3 显示了这三种格式生成的私钥。

相同的私钥比特币扩展公钥,不同格式的私钥

808比特币创始人颜万卫 炮制比特币风险大_比特币bitcoin公钥_比特币扩展公钥

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530ED

十六进制

世界互联网论坛

WIF-压缩

CC32C8FFC6A526AEDD

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB 1Jcn KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGW ZgawvrtJ

这些符号都是表示相同数字、相同私钥的不同方式。 尽管编码后的字符串看起来不同,但不同的格式可以很容易地相互转换。

将 Base58Check 解码为十六进制 sx 工具包(参见“Libbitcoin 和 sx 工具”)可用于编写操纵比特币密钥、地址和交易的 shell 脚本和命令行“管道”。 您还可以使用 sx 工具从命令行解码 Base58Check 格式。

我们使用的命令是base58check-decode:

$sxbase58校验解码5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a 526aedd 128

比特币bitcoin公钥_808比特币创始人颜万卫 炮制比特币风险大_比特币扩展公钥

结果是十六进制的密钥,后跟钱包导入格式 (WIF) 的版本前缀 128。

将十六进制转换为Base58Check编码要转换为Base58Check编码(与上一条命令相反),我们需要提供十六进制的私钥和钱包导入格式(WIF)的版本号前缀128:

$sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a 526aedd 128

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

将十六进制(压缩格式密钥)转换为Base58Check编码

要将压缩私钥编码为Base58Check(参见“压缩私钥”部分),我们需要在十六进制私钥末尾添加后缀01,然后使用与上述相同的方法:

$ sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a 526aedd01 128 KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

生成的WIF压缩格式的私钥以字母“K”开头,表示编码后的私钥后缀为“01”,此私钥只能用于生成压缩格式的公钥(见“压缩格式化公钥”部分)。

公钥格式

公钥也可以用多种不同的格式表示,最重要的是它们以未压缩或压缩的公钥形式出现。

比特币扩展公钥_比特币bitcoin公钥_808比特币创始人颜万卫 炮制比特币风险大

我们从上一篇文章中知道,公钥是椭圆曲线上的一个点,由一对坐标(x,y)组成。 公钥通常表示为前缀 04 后跟两个 256 位数字。 其中一个 256 位数字是公钥的 x 坐标,另一个 256 位数字是 y 坐标。 前缀04用于区分非压缩格式公钥,压缩格式公钥以02或03开头。

下面是上一节私钥生成的公钥,其坐标x和y如下:

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF57 9DC341A

y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

下面是表示为 520 位数字(130 个十六进制数字)的相同公钥。 这个520

位数以前缀04开头,后面是x和y坐标,组成格式为04 xy:

K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF

579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328

AE52DDFE2E505BDB

压缩公钥

808比特币创始人颜万卫 炮制比特币风险大_比特币bitcoin公钥_比特币扩展公钥

引入压缩格式公钥以减少比特币交易的字节数,从而节省运行区块链数据库的节点上的磁盘空间。 大多数比特币交易都包含公钥,用于验证用户凭证和支付比特币。 每个公钥有 520 位(包括前缀、x 坐标、y 坐标)。 如果每个区块有数百笔交易,每天发生数千笔交易,将向区块链写入大量数据。

正如我们在“公钥”部分看到的,公钥是椭圆曲线上的一个点 (x, y)。 椭圆曲线其实就是一个数学方程,曲线上的点其实就是方程的一个解。 因此,如果我们知道公钥的 x 坐标,我们可以通过求解方程 y2mod p = (x3 + 7) mod p 得到 y 坐标。 该方案允许我们只存储公钥的 x 坐标并省略 y 坐标,从而将公钥的大小和存储空间减少 256 位。 每个交易所需的字节数减少了一半,随着时间的推移节省了大量数据传输和存储。

未压缩的公钥以04为前缀,而压缩的公钥以02或03为前缀。这两个不同前缀的原因是:因为椭圆曲线加密的公式左边是y2,即解y 来自平方根,可以是正数也可以是负数。 更形象地说,y 坐标可以高于或低于 x 坐标。 由图中的椭圆曲线图可以看出,该曲线是对称的,从x轴看就像是一面对称镜子的两侧。 因此,如果我们省略 y 坐标,我们必须存储 y 的符号(正或负)。 也就是说,对于给定的x值比特币扩展公钥,我们需要知道y的值是在x轴之上还是之下,因为它们代表椭圆曲线上的不同点,即不同的公钥。 当我们用二元运算在素数p阶的有限域上计算椭圆曲线时,y坐标可能是奇数也可能是偶数,对应前面提到的y值的正负号。 因此,为了区分y坐标的两种可能取值,我们在生成压缩格式公钥时,如果y为偶数则使用02作为前缀,如果y为奇数则使用03作为前缀。 这样就可以根据公钥中给定的x值正确推导出对应的y坐标,从而将公钥解压成椭圆曲线上完整的点坐标。 下图说明了公钥压缩:

下面是上一节生成的公钥,采用264位(66位十六进制数字)压缩格式公钥格式,其中前缀03表示y坐标为奇数:

K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF

579DC341A

这个压缩后的公钥对应同一个私钥,也就是说是由同一个私钥生成的。 但是,压缩格式公钥和非压缩格式公钥之间存在很大差异。 更重要的是,如果我们使用双重哈希函数(RIPEMD160(SHA256(K)))将压缩格式公钥转换为比特币地址,得到的地址将与未压缩格式公钥生成的地址不同。 这个结果可能会令人困惑,因为一个私钥可以生成两种不同格式的公钥——压缩的和未压缩的——而这两种格式的公钥可以生成两个不同的比特币地址。 然而,这两个不同比特币地址的私钥是相同的。

公钥的压缩格式逐渐成为各种比特币客户端的默认格式,可以大大减少交易所需的字节数,同时也减少了存储区块链所需的磁盘空间。 然而,并非所有客户端都支持压缩公钥,因此支持压缩公钥的新客户端必须考虑如何处理来自不支持压缩公钥的旧客户端的事务。

当一个钱包应用程序导入另一个钱包应用程序的私钥时,这一点变得尤为重要,因为新钱包需要扫描区块链并找到与这些导入密钥相关的所有交易。 比特币钱包应该扫描哪个比特币地址? 新客户端不知道使用哪个公钥:因为无论是压缩公钥生成的比特币地址,还是未压缩公钥生成的地址,都是合法的比特币地址,都可以是正确签名的私钥,但是它们是完全不同的比特币地址。 为了解决这个问题,较新的比特币客户端在从钱包导出私钥时将使用不同的钱包导入格式。 这种新的钱包导入格式可以用来表示私钥已经被用来生成压缩公钥,生成的比特币地址也是基于压缩公钥的。 该方案可以解决导入的私钥是来自旧钱包还是新钱包的问题,​​也可以解决公钥生成的比特币地址是来自压缩格式公钥还是非压缩格式的问题公钥。 最后,新钱包在扫描区块链时,可以通过对应的比特币地址,找到该比特币地址所在区块链中发生的交易。 我们将在下一节详细解释这种机制是如何工作的。

压缩格式私钥

比特币bitcoin公钥_808比特币创始人颜万卫 炮制比特币风险大_比特币扩展公钥

其实“压缩格式私钥”是一个误导性的名称,因为当私钥使用WIF压缩格式导出时,不仅没有压缩,而且还比“未压缩格式”私钥长一个字节。 多出的字节是私钥后缀为01,表示私钥来自较新的钱包,只能用来生成压缩公钥。 私钥是未压缩的,不能压缩。 “压缩私钥”实际上只是指“用于生成压缩格式公钥的私钥”,而“未压缩格式私钥”则表示“用于生成未压缩格式公钥的私钥”。 为了避免更多的误解,应该只能说导出格式是“WIF压缩格式”或“WIF”,而不能说私钥是“压缩的”。

请注意,这些格式不能互换使用。 在实施压缩公钥的较新钱包中,私钥只能并且将始终以 WIF 压缩格式(以 K 或 L 为前缀)导出。 对于未实现压缩公钥的旧钱包,私钥将仅以 WIF 格式(前缀为 5)导出。 这样做的目的是给导入这些私钥的钱包一个信号:是使用压缩格式的公钥和比特币地址扫描区块链,还是使用非压缩格式的公钥和比特币地址。

如果比特币钱包采用压缩公钥,它将在所有交易中使用该压缩公钥。 钱包中的私钥将用于生成压缩公钥,然后用于生成交易中的比特币地址。 当从实现压缩公钥格式的比特币钱包导出私钥时,钱包导入格式 (WIF) 将被修改为 WIF 压缩格式,这将在私钥上附加一个字节大小的后缀 01。 . 最终的 Base58Check 编码私钥称为 WIF(“压缩”)私钥,以字母“K”或“L”开头。 而以“5”开头的是从旧钱包以 WIF(非压缩)格式导出的私钥。

十六进制 WIF

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDC C32C8FFC6A526AEDD

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1 Jcn

格式化私钥

十六进制压缩器 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDC

essedC32C8FFC6A526AEDD01

WIF-compr KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGW

essedZgawvrtJ

“压缩格式的私钥”用词不当! 私钥未压缩。 WIF 压缩格式的私钥仅用于表示只能由压缩公钥和对应的比特币地址生成。 相反,“WIF Compressed”编码的私钥多了一个字节,因为它有后缀“01”。 该后缀用于区分“未压缩格式”私钥和“压缩格式”私钥。