主页 > imtoken苹果闪退 > 比特币私钥和公钥生成密码学详解及python模拟
比特币私钥和公钥生成密码学详解及python模拟
特别是 SHA256 和 RIPEMD160。
例子:
# K是公钥,A是生成的比特币地址。
A = RIPEMD160(SHA256(K))
通常用户看到的比特币地址是经过Base58Check编码的,它使用58个字符(一种Base58编号系统)和校验和,提高可读性,避免歧义,有效防止地址转录和输入错误。
从公钥生成比特币地址的过程:
2.1. Base58 和 Base58Check 编码 2.1.1. Base58
Base58 是一种基于文本的二进制编码格式,用于比特币和其他加密货币。
特点:
Base58 是 Base64 编码格式的子集,使用大小写字母和 10 个数字,丢弃了一些在特定字体中容易误读和混淆的字符。 Base58 在 Base64 中不包含 0(数字 0)、O(大写 o)、l(小写 L)、I(大写 i)以及“+”和“/”字符。
即Base58由大小写字母和数字组成,不包括(0, O, l, I) (26+26+10-4=58)。
比特币的 Base58 字母表
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
2.1.2.Base58Check
Base58Check encoding : Base58 格式,版本化,验证过的格式,可以清晰的编码比特币数据编码格式。
Base58Check 编码添加了错误校验码,用于检查转录中的数据发生的错误。校验码长 4 个字节,加在要编码的数据之后。校验码是从待编码数据的哈希值中得到的,因此可以用来检测和避免转录和输入。错误。
例子:
checksum = SHA256(SHA256(prefix+data))
结果由前缀、数据和校验和三部分组成。
Base58Check编码过程
Base58Check 版本前缀和编码结果
键入版本前缀(十六进制)Base58 格式
p>
比特币地址
0x00
1
支付脚本哈希地址
0x05
3
比特币测试网地址
0x6F
m 或 n
私钥 WIF
0x80
5、K 或 L
BIP38 加密私钥
0x0142
6P
BIP32 扩展公钥
0x0488B21E
xpub
2.2.密钥格式
公钥和私钥可以有多种编码格式。密钥以不同格式编码后,虽然结果可能看起来不同,但密钥编码的数字不会改变。这些不同的编码格式主要是供人们使用和使用而不会出错的。找出钥匙。
2.2.1.私钥格式
私钥可以用多种不同的格式表示,所有这些格式都对应同一个 256 位数字。
1)私钥表示(编码格式)
键入版本说明
十六进制
无
64 位十六进制数字
WIF
5
Base58Check 编码:Base58 版本前缀为 128 和 32 位校验和
WIF 压缩
K 或 L
同上,编码前加后缀0x01
2)相同的私钥,不同的格式
下面展示了这三种格式生成的私钥。
格式化私钥
十六进制
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
WIF
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tbfcvU2Jp> - 压缩
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
这些符号都是表示同一个数字、同一个私钥的不同方式。尽管编码后的字符串看起来不同,但不同的格式可以很容易地相互转换。
3)不同编码格式的转换
将 Base58Check 编码解码为十六进制
$ sx base58check-decode 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128
将十六进制转换为 Base58Check 编码
$sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
将十六进制(压缩格式密钥)转换为 Base58Check 编码
$ sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd01 128
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
2.2.2.公钥的格式
公钥也可以用不同的格式表示,主要分为两种形式:未压缩格式和压缩格式。
公钥是由一对坐标 (x, y) 组成的椭圆曲线上的一个点。公钥通常由前缀 04 后跟两个 256 位数字表示。其中一个 256 位数字是公钥的 x 坐标,另一个 256 位数字是 y 坐标。前缀04用于区分未压缩格式的公钥,压缩格式的公钥以02或03开头。
公钥的组成格式:04
例子:
# x,y值
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
# 公钥K
K=04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
1)压缩格式公钥
压缩格式的公钥主要是为了减少比特币交易的字节数,节省运行区块链数据库节点的磁盘空间。原始公钥有 520 位(包括前缀、x 坐标、y 坐标)。公钥是椭圆曲线(y2mod p = (x3 + 7) mod p)上的一个点(x,y),x坐标已知,可以解方程得到y,存储y坐标可以省略。,这样可以减少一半的字节数的存储。
压缩格式中公钥的前缀是02和03,因为解方程的y值有正负两个值,当我们在素数p阶中用二进制算术计算椭圆时在有限域上的曲线比特币密钥丢失,y坐标可以是奇数也可以是偶数,对应于上面提到的y值的正负号。为了区分y坐标的两个可能值,我们生成一个压缩格式的公钥,如果y为偶数,则前缀02;如果 y 是奇数,则前缀 03。
例子:
# 前缀03,表示y坐标是奇数
K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
公钥压缩图:
2)压缩私钥
压缩的私钥实际上只是表示“用于生成压缩格式的公钥的私钥”,而未压缩的私钥用于表示“用于生成未压缩格式的公钥的私钥”。当使用 WIF 压缩格式导出私钥时比特币密钥丢失,不仅 Compressed 并且比“未压缩”的私钥长一个字节。
相同的私钥,不同的格式
格式化私钥
十六进制
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
WIF
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
十六进制压缩
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD*01*
WIF 压缩
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
参考: