06.15 基础课程第八课 私钥、公钥和地址

上一节课,我们介绍了区块链中所用到的现代密码学的相关知识,这一节,我就以比特币为例给大家介绍区块链中在安全方面的使用。

前面我们讲过,比特币的所有价值都是存储在区块链网络中数百万个UTXO(未花费交易输出)中。那么某个UTXO凭什么证明是你的,而不是我的呢?我是不是可以随意支配一个未用过的UTXO呢?我支付给别人的比特币又是怎样保证到达了我想给的人呢?在去中心化的区块链世界中就是通过非对称加密算法来保证这一系列问题的。其中主要涉及三个部分:私钥、公钥和地址。

一、概述

比特币的所有权是通过数字签名、数字密钥和比特币地址来确定的。每笔比特币交易都需要一个有效的签名才会被存储在区块链中,只有有效的数字密钥才能产生有效的数字签名。密钥总是由一个私钥和一个公钥的形式成对出现。公钥就像银行帐号,而私钥就是控制帐户的签名。

支付比特币时,由比特币的当前所有者提交其公钥和签名(由私钥生成),网络中的所有人都可以进行验证,确认交易是否为有效交易,也就是确认支付者是否拥有交易中UTXO的所有权。

每个密钥对包括一个私钥和一个公钥。私钥是一连串随机数,通常是随机生成的。有了私钥,在比特币中通过使用椭圆曲线乘法这个单向加密函数就可以生成公钥。有了公钥,可以通过单向加密哈希函数来生成比特币地址。公钥、私钥和比特币地址之间的关系如下:

基础课程第八课 私钥、公钥和地址

二、私钥

比特币的私钥就是一串256位的随机数字,其实最随机的方式,就是找一枚硬币,朝天抛掷256次,正面朝上则记为数字1,反面朝上则记为数字0,这样随机得到的256位二进制数字就可以作为比特币的私钥。也许这种办法很笨拙,不过千万不要用自己写的或者编程语言内的随机函数来生成一个随机数,这些随机函数都是有据可依的,所生成的随机数也很容易被追溯到。比特币的私钥空间大小是2的256次方,如果换算成十进制,大约是10的77次方,而可见宇宙中估计也只含有10的80次方个原子。所以如果比特币的私钥能保证随机性,基本上是不可能被破解的。

三、公钥

比特币系统中,通过椭圆曲线乘法,可以从私钥计算得到公钥,这是不可逆转的过程:K=k * G。其中k(小写)是私钥,G是椭圆曲线上的生成点,而得到的结果K就是公钥。其反向运算,从已知公钥来反推私钥,基本上是不可能的,就是用暴力破解的办法,利用反复的尝试去算得结果,如果把全球的计算机共同组织起来计算,大概需要几万年可以破解,这显然是不现实的。

那么何为暴力破解,这里给大家举个例子,简单来说明一下。比如我们最经常骑的小黄车ofo,除了蓝牙开锁之外,它可以通过输入密码的方式来解锁。一般来说,小黄车的密码是四位数字,每位数字从1到4,也就是说,如果我们可以对着小黄车手动输入256(4*4*4*4)次组合密码(从1111开始到4444结束),那么一定能试出来小黄车的密码,这样我们就可以免费骑一次小黄车啦。假如我们输入一次密码需要5秒钟,那么理论上我们21分钟就可以打开密码锁了。以上假设均基于小黄车ofo没有其他锁定方式,其实一般都会有连续输错多少次密码就锁定的手段,例如银行就是这样避免暴力破解,连续输错3次密码,就锁定账户。

这种通过大量试错的破解方式,就是暴力破解,没有什么技巧,只要你够快并且有充足的时间就足够啦。而在计算机世界里,最容易的方式就是暴力破解,因为计算机的计算能力绝非人所能相比的,比如小黄车ofo的组合密码,对于手工操作21分钟才能打开,而对于计算机来说,连1微秒都不需要。而上面所说的椭圆曲线算法,即使全世界的计算机加起来也要几万年才能破解,基本就是无可实现的了。

上图就是通过椭圆曲线如何从私钥计算公钥的方法,这里只是给大家一个初步的感官印象,具体技术细节涉及到现代密码学知识,如果有感兴趣的可以留言,我再给大家细讲。

四、地址

地址是一个由数字和字母组成的字符串,可以在区块链中广播,并为所有人共知。由公钥(一个同样由数字和字母组成的字符串)生成的比特币地址以数字“1”开头。比特币地址可由公钥经过单向的加密哈西算法得到。其中使用的SHA256和RIPEMD160。以公钥K为输入,计算其SHA256哈希值,并以此计算结果计算RIPEMD160哈希值,得到一个长度为160比特(20字节)的地址,再通过“Base58Check”编码得到我们常见的比特币地址。

什么是“Base58Check“呢?这要从二进制说起,众所周知,我们的密钥都是0/1的计算机编码规则,但是在现实中存在一个问题,那就是在实际使用中不便于记忆。不信,我给你512个长度的0/1字符串,你抄10遍,至少会错一次以上。也就是说,如果你用这种方法记录你的私钥,使用10次以后,你就会至少错一次,然后,你就会至少支付失败一次。为了便于记忆,采用16进制来替代二进制,也就是用0-9十个数字加上A到F六个字母来表示的一种计数方式。4位二进制形成1位16进制。512个长度的0/1字符串变成了128位,且容易记忆。接下来,为了更便于记忆和存储,出现了Base64编码方式,又压缩了4倍。可是BASE64也容易认错,又变成了Base58。Base58是26个大写字母+26个小写字母+10个数字,再去掉这四个元素:数字"0",大写字母"O",大写字母"I"以及小写字母"l"。Base58Check就是在base58的基础上又增加了教研功能。

公钥通过哈希函数生成比特币地址,当然准确说是两次哈希(SHA256+ RIPEMD160)+一次编码(Base58Check),所以在很多时候,比特币的地址,其实就可以理解为公钥啦。当然并不是所有的地址都是公钥,它还可能是可编程脚本(这其实就是以后我要重点给大家讲的智能合约的前身,只是比特币对其支持一般,而以太坊加强了智能合约的支持)。

基础课程第八课 私钥、公钥和地址

这节课,我们介绍了私钥、公钥和地址,可以说私钥在区块链中至关重要,由于其匿名性,如果你想证明“你是你“,这个币是属于你的,唯一的办法就是用私钥去做数字前面来证明。而私钥的丢失或者复制,则意味着财产的转移。所以在区块链中,如何保护私钥的安全性是第一要务,一般大家都是把密钥对保存在”钱包“中,下一节课,我们就给大家具体介绍什么是”钱包“。


分享到:


相關文章: