由浅及深了解区块链之:(8)私钥,公钥推导比特地址字符串原理

mac2022-06-30  18

比特币的私钥可以唯一推导出一把公钥,那么私钥是如何得到的呢,我们可以那一个一元钱的硬币,依次抛256遍,接着依次记录这256遍的硬币正反面情况,例如(正正反正反反。。。),将正面标记为1,将反面标记为0,于是我们就得到了(110100.。。。)的二进制序列,所以一串256位二进制数的密钥也可以如此产生。其实在现实中,产生私钥的随机数可以由电脑产生,这种电脑模拟产生的随机数称为伪随机数,一般情况下通过密码学安全的伪随机数生成器生成一串随机的字符串,接着将该随机字符串进行单向哈希生成一串256位的二进制,如果该二进制数值处于1~n(n=1.158*1077略小于2256,生成的私钥要避免那些规律的试探性 的二进制数),则生成该私钥,反之,重新换新的随机数生成私钥。

Created with Raphaël 2.2.0 随机数生成器生成了一串随机数 随机经过哈希生成了一串256位二进制数 私钥的二进制是处于1~n之间 确认私钥 yes no

生成了私钥接着就可以相应的推导出它的公钥(椭圆曲线密码学,这个后面再讲),接着由公钥在SHA-256哈希出它的比特币地址,记住这个过程是不可逆的。 这种只能够单向推导的加密方式又称为非对称性加密,这种加密方式多用在对信息的数字签名上面,也就是发送方先将自己的公钥广播到到网络上上的各个节点,接下来发送方将所要发送的信息通过私钥进行加密后发送到网络上,其他的人可以通过公钥进行解密,但是一旦修改文件就一定会被发现,具有了数字签名的唯一性和不可变更性。

推导 推导 不能推导 不能推导 私钥 公钥 比特地址

具有讽刺意味的是,密钥的加密原理并不是比特币区块链的重要组成部分,因为在交易信息在区块链中传递的过程中,这个信息本身是不经过加密的。比特币的交易信息在加入区块链之后就广播给各个节点,然后各个节点里就能找到你的比特币地址的交易记录,不过进行每一笔交易记录都需要比特币的私钥进行确认方可正常进行。 并且私钥存储在一个钱包里,记住钱包里存储的不是比特币的多少,而是私钥(或者是私钥-公钥对),钱包是密钥的一个管理软件,一般用户很少能够直接看到钱包里的私钥,但是一般看到后的密钥也是经过BaseBase58编码,起初来源于Base64编码,指的是对于每6位二进制数,将10个数字和大小写英文字母以及两个特殊字符字符‘+’,’/‘进行一一映射编码,但之后删除了较易混淆的一些字符,数字0,字母O,小写字母l,大写字母I,以及’+’,’/’,剩下的就是58个映射的字符了。就称做Base-58. 接着我们来看看公钥推导为比特币地址的过程。 首先公钥进行单向的哈希加密,SHA-256哈希加密生成256位二进制数,接下来对这个二进制数再进行RIPEMD-169哈希计算,生成160位的二进制数(双哈希加密一方面有利于将公钥统一成为公共的样式,均为160比特·,另一方面,加密成为单向的哈希值,公钥可以单向推导为160二进制数,反之则不能,双向哈希更有利于维护安全性) 接着对160比特二进制数进行两次SHA-256哈希计得到256比特,取这个256比特前4个字节(即32比特)放到160比特的后面(为什么要这样做呢,因为提取的这四个字节在后面是作为验证码来进行的比特验证),再将版本号放在这24字节的头部(版本号以0开头代表的是比特币地址,以1开头的表示私钥地址),就构成了版本-数据-校验组合,我们可以计算一下版本号的字节数

比特地址的字符有34个,换算成比特就有34*6=204比特(版本+数据+校验) 接着用总比特数减去数据和校验的比特数=204-160-32=12bite 所以版本号有12位二进制数

接着对这个组合进行Base58编码,就能输出一串由数字,大小写字母组成的34个字符了。流程如下:

hash256.hash160计算 双hash提取前4个字节 Base58编码 公钥 数据部分 校验码 前缀为零的12bite版本号 版本--数据--校验码 比特地址字符串

是不是到这里就结束了呢,当然不是,还要检测所得到的比特地址字符串是否正确,所以就要进行逆Base58解码,接着将数据部分与尾部4字节校验码分离,对数据部分进行双hash,取得到哈希值的前四个字节与校验码比对,如果一致,则代表该比特地址字符串符合规范,反之,遗弃该字符串,公钥重新生成。

Created with Raphaël 2.2.0 对比特地址字符串进行逆Base58解码 解码后分离数据部分和校验码部分 数据部分进行双SHA-256后提取前四个字节 检测校验码和提取的前四个字节是否一致 检测合格 检测失败,丢弃 yes no
最新回复(0)