主页 > imtoken苹果钱包 > 区块链系列(四)比特币密钥和地址
区块链系列(四)比特币密钥和地址
本文个人博客地址:
1.比特币密钥
比特币的所有权由数字密钥、比特币地址和数字签名确定,数字密钥不存在于网络中,而是由用户生成并存储在文件或简单的数据库中,一般称为钱包。
比特币交易需要有效的签名才能存储在区块链中。只有有效的密钥才能形成有效的数字签名,因此如果您拥有密钥的副本,您将拥有该账户的比特币控制权。
密钥成对出现,由私钥和公钥组成。公钥类似于建行账号,私钥类似于汇票的签名。在比特币交易过程中,收款人的私钥由数字指纹表示,称为比特币地址,类似于汇票上的收款人。一般来说,比特币地址是由私钥生成并对应于私钥的。
1.1. 公钥密码学和加密货币
比特币使用椭圆曲线算法作为公钥加密的基础,是一个不可逆的A函数,即可以从A生成B,但不能从B推导出A。
在比特币系统中,使用公钥加密创建一个密钥对来控制比特币的获取。密钥对由一个公钥和一个从它派生的唯一私钥组成。公钥用于接收比特币,私钥用于在支付比特币时签署交易。从公钥生成的签名可以在不泄露公钥的情况下验证私钥。
在支付比特币时,比特币的当前拥有者需要在交易中提交自己的私钥和签名,而比特币的拥有者可以通过提交的私钥和签名来验证交易是否有效,即确认付款人拥有当时正在交易的比特币的所有权。
1.2.私钥和私钥
比特币包含一系列密钥对,每个密钥对都包含一个私钥和一个公钥。私钥是一个随机数。私钥通过椭圆曲线算法生成私钥,公钥通过双向加密哈希函数生成比特币地址。比特币使用非对称加密,因此签名只能由公钥形成,并且签名p可以被任何人验证而无需泄露公钥。
1.3. 私钥
私钥可以理解为一个随机数,比特币地址对比特币资金的控制依赖于对对应公钥的控制。在比特币交易中,私钥用于生成支付比特币所需的签名以证明资金的所有权。
从随机数生成公钥
选择随机性的来源(熵源),生成比特币公钥本质上和“选择一个介于1和2256之间的数字2256”没有区别。推荐使用密码学安全的伪随机数生成器(CSPRNG ) 来自具有足够熵的源的种子。
1.4.公钥
私钥可以通过椭圆曲线算法从公钥生成,这是一个不可逆的过程:K(公钥)=k(私钥)*G(常数点)。逆向运算,称为“求离散对数”——知道私钥 K 的情况下求公钥 k——非常困难。
1.5.椭圆曲线算法
椭圆曲线密码术是一种基于离散对数问题的非对称(或私钥)加密方法。可以用椭圆曲线上的点除或加来表示。
比特币使用特殊的椭圆曲线和一系列由 secp256k1 标准定义的物理常数。
secp256k1曲线由以下函数定义,形成椭圆曲线:
y2 = (x3 + 7)} 超过 (F*p*)
或
y2 mod p = (x3 + 7) mod p
上面的mod p(对素数p取模)表示曲线在素数阶p 的有限域中,也写成F*p*,其中p = 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1,这是一个特别大的素数。
在椭圆曲线中,一个点的乘法相当于从该点画一条切线,找到另一个与曲线相交的点,然后映射到x轴。
1.6.生成私钥
以随机生成的公钥k为起点,将其与曲线上定义的生成点G相加,得到曲线上的另一点,即对应的私钥K。生成点为secp256k1的一部分标准中,比特币的私钥的生成点是相同的,所以一个公钥k对应一个唯一的私钥K,只能在两个方向上操作比特币公钥如何查询,即不能从私钥导出公钥k K.
{K = k * G}
例子:
K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G
K = (x, y)
其中,
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
2.比特币地址
比特币地址是一串可以公开的数字和字母。私钥生成的比特币地址通常以数字1开头。
示例:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
在比特币交易中,比特币地址通常用来代表收款人。
比特币地址是通过双向加密哈希算法从私钥中获得的。哈希算法是一种单向函数,它接收任意宽度的输入以形成指纹摘要。从私钥生成比特币地址的算法如下:
特别是 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 编码:Base58 格式的版本化、校准格式,可以清晰地编码比特币数据。
Base58Check 编码减少了错误检查代码以检测数据转录中出现的错误。校验和是 4 个字节长,然后添加到要编码的数据中。校验和是从待编码数据的哈希值中得到的,因此可以用来衡量和防止转录和输入形成Error。
例子:
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
5J3mBbAH58CpIF3Y5RNJpUKPE62SQ5tbfcvU2Jp> - 压缩
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)压缩格式私钥
压缩格式的私钥主要是为了减少比特币交易的字节数,节省运行区块链数据库节点的c盘空间。原始私钥有 520 位(包括前缀、x 坐标、y 坐标)。公钥是椭圆曲线(y2mod p = (x3 + 7) mod p)上的一个点(x, y),x坐标已知,可解多项式得到y,y坐标可以省略storage,这样可以减少一半的存储字节数。
压缩格式中私钥的前缀是02和03,因为解多项式的y值有负值和正值。当我们在素数p阶上用二进制算术估计有限域上的一条椭圆曲线时,y坐标可能是素数也可能是素数,对应上面提到的y值的正负号。为了区分y坐标的两个可能值,我们在生成压缩格式私钥的时候,如果y是素数,就用02作为前缀;如果 y 是素数,则使用 03 作为前缀。
例子:
# 前缀03,表示y坐标是奇数
K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
p>
公钥压缩图:
2)压缩公钥
实际压缩后的公钥 以上仅表示“用于生成压缩格式私钥的公钥”,未压缩公钥用于表示“用于生成未压缩格式私钥的公钥” 当使用 WIF 压缩格式导入公钥时,不仅是未压缩的,而且比“未压缩”的私钥长一个字节。
相同的公钥,不同的格式
格式化公钥
十六进制
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
WIF
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
十六进制压缩
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD*01*
WIF 压缩
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
参考: