首页 » 网站推广 » phpbitcoin公私钥技巧_区块链技能开拓之二深度分析比特币的私钥公钥和地址

phpbitcoin公私钥技巧_区块链技能开拓之二深度分析比特币的私钥公钥和地址

duote123 2024-12-08 0

扫一扫用手机浏览

文章目录 [+]

私钥

先说说私钥,一样平常我们看到的私钥是下面这样的一段字符串:

5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss

phpbitcoin公私钥技巧_区块链技能开拓之二深度分析比特币的私钥公钥和地址

支持比特币协议的运用都可以精确把这段字符串转换成比特币的私钥,再转换出公钥,再得到一个地址,如果该地址上面有对应的比特币,就可以利用这个私钥花费上面的比特币。
私钥实质上是随机数私钥实质上是一个随机数,由32个byte组成的数组,1个byte即是8位二进制,一个二进制只有两个值0或者1。
以是私钥的总数是将近2^(832)=2^256个,但是有一些私钥并不能利用,他真实的大小是介于:

phpbitcoin公私钥技巧_区块链技能开拓之二深度分析比特币的私钥公钥和地址
(图片来自网络侵删)

1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141

之间的数。
这个数量已经超过了宇宙中原子的总数,想要遍历所有的私钥,耗尽全体太阳的能量也是不可能的。

我们所说的比特币私钥的是密码学上面安全的,并不是说不可能涌现重复的私钥,而是说不可能通过遍历的办法找到某一个特定的私钥,或者通过其它的办法找,而不通过私钥就能花费地址上面的比特币,私钥的安全性是由数学上担保的。
私钥的总数量很大,但是私钥的天生是依赖随机数的,真正的随机是很难做到的,大部分私钥的天生都是依赖于伪随机算法(PRNG):“伪随机是用函数天生随机数。
它并不真正是随机的。
只是一个比较近似真随机的随机数。

私钥天生的随机性就很主要的,密码学上安全的随机是指:“随机是不可预测的,随机的结果是不可遍历的,如果不是安全的随机数天生器,天生的私钥就有可能被别人碰撞到。
不依赖随机天生的私钥就会大大的降落其天生的概率空间。
”公钥和地址的天生都依赖私钥,以是我们只须要保存私钥即可,有了私钥就能天生公钥和地址,就能够花费对应地址上面的比特币。

私钥到字符串

上面提高的私钥字符串是按照一定的规律从32位byte数据格式化天生的,32个byte的数组是由256个0或者1组成的,如果显示出来,不仅仅是识别率不高,而且私钥太长。
因此私钥字符串便是对付原始的随机数进行一定的转换,转换为识别率高的形式,上面私钥的是对32个byte数组就做了Base58的转换.

Base58是用于比特币中利用的一种独特的编码办法,紧张用于产生Bitcoin的钱包地址和私钥。
比较Base64,Base58不该用数字”0″,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/”符号。
这样做的紧张缘故原由是为了肉眼随意马虎识别,在输入的时候不随意马虎打错。

不过上面那段没有规律的字符串输入起来还是挺费劲的,当然也可以把私钥转换其他形式,比如以单词的形式(12或者24个单词),脑钱包的形式,又或者自己记住的某一句话来天生私钥,把稳脑钱包天生的私钥随机的安全性并不高。
我们看到的私钥除了以5开头的以外,还有以L和K开头的私钥,为什么会涌现这样的情形呢?5,L,K又带代表什么呢?这就要说到公钥了。

公钥

比特币的根基是椭圆曲线数字署名算法:

椭圆曲线数字署名算法(ECDSA)是利用椭圆曲线密码(ECC)对数字署名算法(DSA)的仿照

椭圆曲线加密法(ECC)是一种公私钥加密技能:

ECC以椭圆曲线理论为根本,利用椭圆曲线等式的性子来产生密钥,而不是采取传统的方法利用大质数的积来产生,其特点是:密钥长度小,安全性能高,全体数字署名耗时小。

DSA(DigitalSignature Standard)数字署名技能:

在DSA数字署名和认证中,发送者利用自己的私钥对文件或进行署名,接管者收到后利用发送者的公钥来验证署名的真实性。

这里明确了私钥用来署名,而公钥用来验证署名。
公钥是由私钥天生的,通过椭圆曲线(ECPoint)天生,一个私钥经由椭圆曲线变换之后能够得到公钥,公钥是一个65个byte数组,一样平常我们会看到这样的一个公钥:

04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235

显示出的公钥一样平常把byte数组是经由hex(16进制)的处理之后显示,不经由Base58的缘故原由是: 公钥是用来验证私钥的署名,一样平常我们很少会看到公钥,利用私钥署名交易之后,会把自己的公钥一起和交易发送出去,这样对付一个完全的交易开说,他就利用交易里包含的公钥验证私钥的署名是否精确。
私钥和公钥是成对涌现的,一个私钥署名的数据,只有对应的公钥才能对其进行验证,而地址也是从公钥天生的,这样就可以验证花费的交易是不是属于这个地址了!

回答下上面的问题为什么会涌现5开头或者L,K开头的私钥?

涌现这种情形是由于公钥的不同格式而产生了不同的私钥格式,早期的比特币开拓者没有利用压缩的公钥(椭圆曲线是对称的,知道了一半的信息就可以推导出来其余一半的信息了),因此只须要保存一样平常的公钥信息即可。
压缩的公钥只有33个byte,而未压缩的公钥有65个byte。
私钥开头的第一位的不同,是用来区分该私钥利用的公钥是否支持压缩格式。

压缩的公钥比拟特币的意义很大,比特币是去中央化的p2p加密货币,每个节点都会拥有完全的交易记录,除了coinbase(挖矿得到的比特币)以外,每个交易都须要发送公钥,支持压缩格式的公钥,每个交易的数据就可以减少32个字节,这对全体比特币网络是非常故意义的,全体比特币网络的数据在传输和保存中都可以提高不少效率。
而对私钥进行Base58编码的时候,老版本未压缩公钥的私钥是33位byte数组,第一位存放私钥的Version信息,当前值为128,天生的Base58都因此5开头,老版本未压缩私钥=Base58(version+32位随机数)。

支持压缩公钥的私钥是34位,同样是第一位是version信息,它的值也是128,而多出来的一位是末了一个byte是用来存放是否压缩信息的信息,1就表示是支持压缩格式的公钥。
经由Base58处理之后恰好是L或者K开头,新版本私钥格式=Base58(version+32位随机数+是否支持压缩)。

例子中的私钥不仅仅包含了32个byte数组的信息,还是私钥version的信息以及其公钥是否压缩的信息(通过位数和值来判断),公钥是否压缩除了对私钥的显示有影响以外,还会对地址有影响。

地址

公钥太长了,以是就有更短一些的地址的观点,另一方面没有发送过交易的地址,并不想暴露自己的公钥,而地址是通过择要算法天生的,不会暴露公钥的真实内容:

地址是由公钥产生的,地址长度为25byte,经由base58处理,地址未尾添加了4个字节的校验位。

我们看到的地址一样平常都是Base58编码处理的,地址的天生比较繁芜,公钥到地址天生的过程是,先对公钥做一次SHA256(哈希算法)。

sha-256-hash= SHA-256(public key)

再经由了hash160处理, hash160:RIPEMD(PACE integrity Primitives Evaluation Message Digest)是一种原始完全性校验择要,160标准对应20字节:

hash160=hash160(sha-256-hash)

对结果进行hash160处理可以得到一个20个byte的数组,在这个20位的byte数组前面再加上一个byte,这个byte便是地址的Version信息,地址的Version当前值为0,Version信息在比特币的test网络上会利用不同的值,比特币地址完成的表示便是:

address=Base58(version+hash160(SHA-256(public key))+checksum)

checksum是用来对付比特币地址进行考验的,再得到的hash160中加入地址的version信息 ,再对该信息做两次SHA-256之后取前4位便是checksum:

checksum=get_front_four( SHA-256(SHA-256(version+hash160)))

个中hash160是这个过程中最主要的信息,从这个值就可以到地址的前21位(第一位是version)和后面的checksum, 进而可以天生Base58格式的地址。
而从Base58格式的地址中也可以得到hash160,也便是说hash160格式可以和Base58格式的地址互换。

私钥的不同对付地址有什么样的影响呢?

前面已经说了,一个随机数可以有一个压缩的公钥,和一个未压缩的公钥。
而每个公钥都会天生一个地址,上面私钥实在可以有两个地址分别为:

1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN(未压缩公钥)

1F3sAm6ZtwLAUnj7d38pGFxtP3RVEvtsbV (压缩公钥)

这两个地址都是这一个随机数天生的地址,每个地址上面的比特币都可以用这个随机数对应的私钥花费。
目前大多数的运用默认都利用压缩格式的私钥。

总结

对付私钥,公钥和地址来说,公钥作为私钥到地址的中间桥梁,他在交易的验证是最关键的。

对付一个交易的验证,公钥的浸染:

公钥天生地址,验证发送交易的地址是否和该公钥天生的地址同等;

公钥验证私钥的署名,用来验证该交易是否利用了精确的私钥署名;

私钥天生公钥是成对涌现,公钥可以天生对应的唯一地址,这样就能确认了该地址发送的交易是否利用了对应的私钥。

关注@区块链学习条记,一起学习区块链

标签:

相关文章