主页 > imtoken冷钱包app > 比特币密钥的格式

比特币密钥的格式

imtoken冷钱包app 2023-03-30 05:30:06

公钥和私钥都可以以多种格式编码。以不同格式对密钥进行编码后,虽然结果可能看起来不同,但密钥中编码的数字不会改变。这些不同的编码格式主要是为了方便人们正确使用和识别密钥。

私钥格式

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

私钥表示(编码格式)

键入版本说明

HexNone64 位十六进制数

Base58Check 编码:带版本的 Base58

p>

WIF5

128 位和 32 位校验和的前缀

WIF-compressedK 或 LA 同上,在编码此格式生成的私钥之前添加后缀 0x01。

相同的私钥,不同格式的私钥

每一个比特币都有唯一编码吗

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530ED

十六进制

WIF

WIF - 压缩

CC32C8FFC6A526AEDD

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB 1Jcn KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGW ZgawvrtJ

这些不同的表示用于表示同一个私钥。尽管编码后的字符串看起来不同,但不同的格式可以很容易地相互转换。

Base58Check 编码和解码到 hex sx 工具包(请参阅“Libbitcoin 和 sx 工具”)可用于编写一些 shell 脚本和命令行“管道”来操作比特币密钥、地址和交易。您还可以使用 sx 工具从命令行解码 Base58Check 格式。

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

$sxbase58check-decode5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a 526aedd 128

每一个比特币都有唯一编码吗

所得结果是十六进制的密钥,紧接着是钱包导入格式(WIF)的版本前缀128。

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

$sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a 526aedd 128

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

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

要将压缩格式的私钥编码为Base58Check(参见“压缩格式的私钥”一节),我们需要在十六进制私钥后面加上后缀01,然后使用相同的方法:

$ sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a 526aedd01 128 KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

压缩格式的WIF压缩键以“格式”的形式,以“K”的形式生成一个“压缩格式的公钥”(suff1),并且私钥只能用于生成压缩格式的公钥(见部分“压缩格式的公钥”)。

公钥格式

公钥也可以用许多不同的格式来表示。

每一个比特币都有唯一编码吗

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

下面是由前文中的私人所生成的关联,其坐标x和y如下:

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF57 9DC341A

y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2 E505BDB

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

比特的数字预测以04剧情,紧接着是x及y坐标,组成格式为04 x y:

K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF

579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328

AE52DDFE2E505BDB

压缩公钥

每一个比特币都有唯一编码吗

引入压缩公钥是为了减少比特币交易中的字节数,可以节省那些运行区块链数据库节点的磁盘空间。大多数比特币交易都包含公钥,用于验证用户凭据并以比特币支付。每个公钥有 520 位(包括前缀、x 坐标、y 坐标)。如果每个区块有数百笔交易,每天发生数千笔交易,就会有大量数据写入区块链。

正如我们在“公钥”部分中看到的,公钥是椭圆曲线上的一个点 (x, y)。椭圆曲线其实是一个数学方程,曲线上的点其实就是方程的解。因此,如果我们知道公钥的 x 坐标,我们可以通过解方程 y2mod p = (x3 + 7) mod p 得到 y 坐标。这种方案允许我们只存储 x 坐标

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

比特币密钥的格式

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

K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF

579DC341A

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

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

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

每一个比特币都有唯一编码吗

压缩格式的私钥

实际上“压缩格式的私钥”是用词不当,因为当使用 WIF 压缩格式导出私钥时,不仅没有压缩,而且比“未压缩”的私钥长一个字节。额外的字节是私钥后缀为01,表示私钥来自较新的钱包,只能用于生成压缩公钥。私钥未压缩,无法压缩。 “压缩的私钥”实际上只是指“用于生成压缩公钥的私钥”,而“未压缩的私钥”是指“用于生成未压缩的公钥的私钥”。为了避免进一步的误解,应该只能说导出格式是“WIF Compressed Format”或“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 压缩”编码的私钥多一个字节,因为私钥有一个后缀“01”。这个后缀用来区分“未压缩”的私钥和“压缩”的私钥。