主页 > 海外版imtoken > 比特币私钥、公钥和地址的关系
比特币私钥、公钥和地址的关系
哈希函数
哈希函数,也称为哈希函数,给定一个输入x,它会计算出对应的输出H(x)。哈希函数的主要特点是:
输入x可以是任意长度的字符串,输出结果是H(x)的长度是固定的。计算 H(x) 的过程是高效的(对于一个长度为 n 的字符串 x,计算 H(x) 的时间复杂度应该是 O(n)。Victor Miller 单独提出。它的主要优点是在在某些情况下,它使用比其他算法(例如 RSA)更小的密钥,但提供相当或更高级别的安全性。
比特币使用基于 secp256k1 椭圆曲线数学的公钥加密算法。它包含一个私钥和一个公钥。私钥用于签署交易并将签名和原始数据发送到整个比特币网络。公钥被整个网络中的节点用来验证交易的有效性。签名算法保证交易由拥有对应私钥的人签发。
BASE58 编码
Base58是比特币独有的编码方式,主要用于生成比特币钱包地址
相对于Base64,Base58不使用数字“0”、大写“O”、大写“I”、小写“l”以及“+”和“/”符号
p>
比特币字母表:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
门罗字母:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Ripple 使用的字母表:
rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz
私钥
其实是一个长度为256位的二进制数比特币交易公钥私钥,256位=1.15e+77
宇宙中的原子总数约为 10 的 80 次方。如果我们随机生成私钥2^256+1次,那么必然会生成之前出现过的私钥;即使从概率上看,如果我们生成私钥 2^130 次,有 99% 的机会得到私钥,但目前这种情况极为罕见。
公钥
使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥对应的未压缩公钥,这个过程是不可逆的。
公钥长度为65字节:
地址
公钥经过多次哈希处理,生成btc地址。
未压缩的公钥 密钥生成地址的过程:
对完整的公钥(header ID + X-integer + Y-integer)进行sha256()操作比特币交易公钥私钥,对结果进行ripemd160()操作,a的结果是长度为20bytes
在第一步得到的结果前加上Network ID Byte:
得到的b长度为21bytes
对第2步得到的结果做如下连续两次sha256()运算,然后只取运算结果的前4个字节作为校验和
将第3步得到的Checksum加到第2步b的末尾,得到c,长度为25bytes
将第4步生成的c用Base58编码得到地址
步骤图:
对于压缩后的公钥,在生成地址时,在步骤1中,只能取标识头+X-integer部分的公钥。
私钥、公钥和地址在比特币转账中的作用
发起比特币转账时,将私钥视为账户密码。填写账单后,需要使用私钥对账单内容进行签名,获取签名信息SIG,然后将SIG附加到账单上:
SIG = SIGN(TX_DETAIL, PRIVATE_KEY)
知道SIG和账单内容后无法推断出私钥。那么,有人拿到账单信息和SIG后,如何验证SIG确实是由该方地址对应的私钥签名的呢?
这是公钥的功能。公钥应附在账单上。别人拿到账单的时候,可以验证SIG是否合法
true = VALIDATE(TX_DETAIL, SIG, PUBLIC_KEY)
私钥->公钥->地址是单向不可逆过程,在签署交易信息时只暴露公钥,私钥是安全的:
关于btc交易和签名验证的原理和规则,可以搜索相关文献了解