区块链入门 ① - 私钥、公钥、地址

区块链入门 ① - 私钥、公钥、地址

相关资源

豆瓣:精通区块链编程

私钥、公钥、地址

概述

一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。

  • 私钥(k)是一个数字,通常是随机选出的。
  • 有了私钥,我们就可以使用椭圆曲线乘法这个单向加密函数产生一个公钥(K)。
  • 有了公钥(K),我们就可以使用一个单向加密哈希函数生成比特币地址(A)。

前置知识

椭圆曲线乘法

比特币使用椭圆曲线乘法(secp256k1)作为其密码学的基础,其使用的是一个特定的椭圆曲线和一组数学常数。

类似下图,但实际上该曲线被定义在一个素数阶的有限域内,而不是定义在实数范围。

  • 无穷远点:一个特殊的点,大致对应于 0 在加法中的作用。
  • 加法:

    • 给定椭圆曲线上的两个点 P1 和 P2,则椭圆曲线上必定有第三点 P3 = P1 + P2。几何图形中,该第三点 P3 可以在 P1 和 P2 之间画一条线来确定。这条直线恰好与椭圆曲线上的一点相交。此点记为 P3'=(x,y)。然后,在 x 轴做映射获得 P3=(x,-y)。
    • 如果直线 P1P2 完全垂直时,P3 = “无穷远点”。
    • 加法遵守结合律,这意味着(A+B)C = A(B+C)。
  • 乘法:给定椭圆曲线上的点 P,如果 k 是整数,则 k * P = P + P + P + …+ P(k 次)。注意,k 有时被混淆而称为“指数”。
Base58Check 编码

  • Base58 编码:由不包括(0,O,l,I)的大小写字母和数字组成。
  • Base58Check 编码:一种 Base58 格式的、有版本的、经过校验的格式,可以明确的对比特币数据编码的编码格式。
  • “版本字节”前缀:为了方便地识别编码的数据类型,先对数据添加一个前缀。
数据类型版本前缀 (16 进制)Base58 格式
Bitcoin Address0x001
Pay-to-Script-Hash Address0x053
Bitcoin Testnet Address0x6Fm or n
Private Key WIF0x805, K or L
BIP38 Encrypted Private Key0x01426P
BIP32 Extended Public Key0x0488B21Expub
  • 检验和:对之前的前缀 + 数据运行两次 SHA256,将散列值的前 4 个字节作为校验和添加到数据之后。

私钥

本质上为一个 256bit 的数字,需要由足够安全的熵源,即随机性来源生成。

  • 格式

    • 非压缩格式:K 或 L 前缀,表示“用于生成非压缩格式公钥的私钥”。
    • 压缩格式:5 前缀,表示“用于生成压缩格式公钥的私钥”。在“非压缩格式”私钥加了后缀 0x01,用于区分。

公钥

通过椭圆曲线算法可以从私钥计算得到公钥,这是不可逆转的过程:K = k * G 。其中 k 是私钥,G 是被称为生成点的常数点,而 K 是所得公钥。

其中所有比特币用户的生成点 G 是相同的,一个私钥 k 乘以 G 必将得到相同的公钥 K。

  • 格式

    • 非压缩格式:0x04 前缀,紧接着两个 256bit 数字,表示 x 坐标和 y 坐标。
    • 压缩格式:0x02 或 0x03 前缀,紧接一个 128bit 数字,表示 x 坐标。已知 x 坐标后,可解方程得出 y 坐标。如果 y 是偶数,则使用 0x02 作为前缀;如果 y 是奇数,则使用 0x03 作为前缀。

      • 注意:在实数域的 y 坐标为正负,而在素数 p 阶的有限域上 y 坐标为奇偶。
    • 带来的问题:两种公钥格式会导致生成的地址将完全不同。当钱包软件导入私钥时尤其重要,因为新钱包需要扫描区块链并找到所有与这些被导入私钥生成的地址相关的交易。因此私钥也有相应的格式区分,用于表示该生成哪种格式的公钥及相应地址。

地址

A = RIPEMD160(SHA256(K)),公式中 K 是公钥,A 是生成的比特币地址。

地址通常还要经过Base58Check编码。

作者:LMessi原文地址:https://segmentfault.com/a/1190000043279411

%s 个评论

要回复文章请先登录注册