公钥和私钥
比特币的所有权是通过数字密钥,比特币地址和数字签名来确定的。数字密钥实际上并不存储在网络中,而是由用户生成后,存储在一个叫钱包的文件或简单的数据库中。存储在用户钱包中的数字密钥完全独立于比特币协议,可以由用户的钱包软件生成并管理。
大多数比特币交易都需要一个有效的签名才能被存储在区块链。只有有效的密钥才能产生有效的数字签名。用于支出资金的数字签名也成为见证(witness),比特币交易中的见证数据证明了所用资金的真正归谁所有。
私钥(k)是一个数字,随机选出,有了私钥,使用椭圆曲线乘法单向加密函数产生一个公钥(K),再使用单向加密哈希函数生成比特币地址(A)。
![](https://img.haomeiwen.com/i11530250/fdd8ea50c956f898.png)
使用非对称加密的理由:
非对称密码学的有用属性是生成数字签名的能力。可以将私钥用于交易的数字指纹以产生数字签名。访问公钥和交易指纹的任何人都可以使用它们来验证签名。打一个非常容易理解的比方:公钥就好比某个人在外的名声,私钥就好比这个人的公章,只要在自己作品上盖上公章(签名),大家都可以验证这个作品的真实性。
私钥
一个比特币地址中的所有资金的控制权取决于相应私钥的所有权和控制权。
随机得到的256位二进制数字可作为比特币钱包的私钥,私钥进一步生成公钥。
生成私钥的随机性如何做到真正的随机性,也就是要找到足够安全的熵源。其实要做到两点,在1和2^256之间随机选一个数,要不可预测和不可重复。
由操作系统随机数生成器随机选择一个256位的数字,检查大小是否合法。从工程角度看,一般通过一个密码学安全的随机源中取出一长串随机字节,SHA256哈希算法运算,产生一个256位的数字,结果大小合法,就是一个合适的私钥。否则,重复上述步骤。
公钥
通过椭圆曲线乘法可以从私钥计算得到公钥,这是一个不可逆的过程:K=k*G。k是私钥,G是生成点的常数点,而K是公钥。其反向运算,被称为“寻找离散对数”是非常困难的。
椭圆曲线乘法是密码学中“陷阱门”功能的一种函数:在一个方向(乘法)很容易做,而不可能在相反的方向(除法)做。
Elliptic Curve Cryptography
椭圆曲线加密法是一种基于离散对数问题的非对称加密法,可以用对椭圆曲线上的点进行加法或乘法运算来表达。
![](https://img.haomeiwen.com/i11530250/9e50e4f0b3c91273.gif)
简单理解椭圆曲线加密:通过一个高信息熵的随机数,在合理区间范围内选取椭圆曲线上的一个初始点,然后如上图一样弹来弹去。
![](https://img.haomeiwen.com/i11530250/a2090a70b7b256bd.gif)
经过n次后,到达终点,如果知道弹跳路线图,那么推导出起点和终点将是非常简单的,如果只知道起点和终点,想要推导出弹跳路线图,那就是非常困难的,这就是trapdoor函数的大概原理。
如果想要更加清晰理解ECC,阅读这篇文章:
生成公钥
私钥k为起点,将其与曲线上预定的生成点G相乘获得曲线上的另一点,得到公钥K。k和K关系是固定的,只能单向运算。
比特币地址
P2SH(Pay-to-Script-Hash),从公钥生成比特币地址。
由公钥生成比特币地址使用的算法是SHA256和RIPEMD160。
![](https://img.haomeiwen.com/i11530250/9c9a863451d2fd44.png)
通常用户见到的比特币地址是经过Base58转化而来的。公钥到比特币地址如上图所示。
![](https://img.haomeiwen.com/i11530250/1ede6ac0ad2c3c4b.png)
上面是如何进行Base58Check编码。
P2SH(Pay-to-Script-Hash)和多重签名地址
P2SH地址,有时候被人误称为多重签名或多重签名地址。指定比特币交易中受益人为哈希的脚本,而不是公钥的所有者。
一个P2SH地址从交易脚本中创建,定义谁消耗这个交易输出。编码一个P2SH地址涉及使用一个在创建比特币地址用到过的双重哈希函数,并且只能应用在脚本而不是公钥。
P2SH不一定是多重签名的交易,也可能是编码其他类型的交易脚本。
多重签名地址和P2SH
顾名思义,底层脚本需要多个签名来证明所有权,才能消耗资金。设计比特币多重签名特性是需要从总共N个密钥中需要M个签名,(M<=N)。
网友评论