优得学院第五课:区块链核心成员

大家好,欢迎来到区块链课堂,本课程由Ulord团队与动脑学院联合打造,我是本课讲师杨博士,上一讲中,我们介绍了区块链很重的密码学基础,在接下来的两讲中,我们将以比特币为例来学习一些在比特币中用来控制资金所有权的密码学技术。包括密钥,地址以及钱包,这一讲我们重点介绍密钥,为什么说密钥对于区块链非常重要呢?

我们以比特币交易为例,在每一笔的比特币交易中,都需要有有效的签名,交易信息才会被存储在区块链上,这个有效的数字签名就是由密钥产生的,因此,拥有比特币的密钥就拥有了该账户的比特币的控制权,因此密钥对于区块链是非常核心也非常基础的技术之一。

优得学院第五课:区块链核心成员_第1张图片

一、公钥和私钥

这是本讲的内容提纲,首先回顾一下公钥和私钥,在上一讲中讲过公钥密码体制,我们知道在公钥密码体制中存在一个公钥和一个私钥,公钥与私钥是通过一种算法得到的一个密码对,公钥是密钥对外公开的部分,而私钥是非公开的部分。

公钥通常用于加密绘画的密钥,比如在对称密码算法中的加密密钥,也可以用来验证数字签名,或者加密可以用相应私钥紧密的数据,通过这种算法得到的密钥对能保证在世界范围内是唯一的。

优得学院第五课:区块链核心成员_第2张图片

使用这个密钥对的时候,如果用其中的一个密钥加密一段数据,就必须用对应的另外一个密钥来解密,比如我们用公钥加密数据就必须用私钥来解密,就像图中的例子,这个Bob和这个Alice要进行通信,那么首先要用Alice的公钥对绘画内容进行加密得到密文,Alice收到密文以后,要用她自己的私钥对密文进行解密得到对应的明文,这就是我们要用公钥加密,用对应的私钥来解密。

那么如果用私钥加密就必须用对应的公钥来解密,就上一讲我们讲的数字签名里面就是讲的用私钥来加密,用公钥来解密,公钥在这里就像银行的账号,私钥就像控制账号的PIN码或者说支票的签名,在比特币中,公钥主要用来接收比特币,私钥主要是用于比特币支付时候的交易签名。

实际上,比特币的用户很少会直接看到这个数字密钥,一般情况下面,它们被存储在钱包文件内,由比特币钱包软件进行管理,那么钱包呢?指的是保存比特币地址和私钥的软件,可以用来接收,发送,储存用户的比特币,那么关于钱包的技术细节在后续的课程中有专门的介绍。

优得学院第五课:区块链核心成员_第3张图片

接下来看一下私钥,公钥以及比特币地址的生成,首先私钥其实就是一个随机选出的数字而已,这个小k就是随机选出的一串数字,那么生成密钥的第一步也是重要的一步,就是要找到足够安全的商源,也就是随机性来源,生成一个比特币私钥,在本质上与在从1到2的256次方之间选一个数,这两个问题本质上是没有差别的。

只要选取的结果是不可预测和不可重复的,那么选取数字的方法并不重要,那么实际上在比特币软件里面,通常是使用操作系统底层的随机数生成器,来产生一个256位的商,那么生成了私钥,就可以由私钥经过椭圆曲线乘法得到公钥。也就是图中的从小k到大k这样的过程,这里的椭圆曲线乘法是一个单向不可逆的算法,等会我们会详细介绍。

得到了公钥,我们可以由公钥经过一个单向的加密哈希函数生成比特币地址,这一部分过程等下也会详细展开。

先来看由私钥如何生成公钥?

刚才讲了在比特币中,通过椭圆曲线乘法来生成公钥的,椭圆曲线乘法是一种基于离散对数问题的非对称加密法,可以用对椭圆曲线上的点进行加法或乘法运算来表达,具体来说以一个随机生成的私钥k为起点,我们将其曲线上面预定的生成点G相乘获得曲线上面的另一点相应的公钥大K,这里面比特币密钥的生成点G都是相同的,大家可以看这个公式

K=k X G

小k是私钥,G是生成点,在该曲线上面所得到的点大K就是公钥,因为所有比特币用户的生成点都是相同的,那么一个私钥小k乘以G将得到相应的公钥大K,小k和大K之间的关系是固定的,但只能单向运算,从小k得到大K,其反向运算被称为寻找离散对数,也就是从已知公钥K求出私钥小k是一个非常困难的事情,就像去实现所有可能的k值,也就是暴力搜索,这就是为什么可以把比特币地址与所有人共享而不会泄露私钥的一个原因。

虽然大多数椭圆曲线都是在高维空间中的,但是还是使用较为简单的实数范围内的椭圆曲线来做说明,但是这中间的数学原理都是相同的,我们的目标是要找到生成点G的倍数kG,也就是将这个G相加k次。

在椭圆曲线中,这个点相加等同于从这一点画切线,画这个椭圆曲线的切线,找到这个曲线相交的另外一点,然后翻折到X轴,以这个X轴为对称轴做一个翻转,那么我们这个图上大家要注意看,这个图上显示了曲线上得到的G,2G、4G、8G等几个操作,椭圆曲线乘法是密码学家称之为“陷阱门”功能的一种函数:在一个方向(乘法)很容易做,而不可能在相反的方向(除法)做。

这个特点和哈希函数很像,也就是单向不可逆,那么这个数学技巧成为了证明比特币资金所有权不可伪造和安全的数字签名的基础,这就是我们说的从私钥生成公钥的这么一个过程,利用的是椭圆曲线乘法这样一个算法。

优得学院第五课:区块链核心成员_第4张图片

那么有了公钥,接下来可以生成比特币地址,比特币地址你可以理解为你的账户身份ID或者比喻为银行卡号,只不过这里的地址是由一串字符和数字组成的,以阿拉伯数字1开头,这些字符和数字由密码算法来产生,具体来说比特币地址可以由公钥经过单向的加密哈希算法得到,由公钥生成比特币地址使用的算法是SHA256和RIPEMD160,这个在讲哈希函数应用的时候也讲过。

这里公钥K为输入计算SHA256哈希值,并以此结果计算RIPEMD160哈希值,得到一个长度为160位也就是20个字节的数字,也就是这样的一个公式,这里面的k是公钥,A是生成的比特币地址,由于哈希函数的单向不可逆,也就是你知道了比特币地址是无法通过解密算法来计算出私钥的。

就目前的算力来说无法破解,因此你能放心的把地址公布到网上,利用比特币钱包生成的比特币地址可以接收来自他人的比特币,你也可以将你账户的比特币转到他人的比特币地址,从这个角度来看比特币地址就像银行卡号一样具有支付,转账,体现功能,但在转账的时候你只有知道别人的比特币地址才能进行这个转账,这就是从公钥到比特币地址生成的一个过程。

二、加密货币

加密货币又称为密码货币,它是一种匿名性的数字货币,使用密码学原理确保交易的安全以及控制交易单位创造的一种交易媒介,加密货币是数字货币的一种,比特币在2009年成为第一个去中心化的加密货币,这之后加密货币多指此类基于区块链技术设计的数字货币,至此种类繁多的加密货币被创造出来。

那么货币基于去中心化的共识机制与依赖监管体系的银行金融系统相对,加密货币不依靠法定的货币机构发行,也不受央行的管控,它依据全世界的计算机运行一组方程式的开源代码,通过大量的算力处理来产生,使用密码学的设计来确保货币流通各个环节的安全性。

基于密码学的设计可以使加密货币只能被真实的拥有者转移或者支付,加密货币与其他非加密货币最大的不同是其总量有限且具有极强的数量稀缺性,开采的越多币升值的越高,为什么呢?大家想一想,是的,因为开采的越多,那么未开采的越少,总体上是通缩的,因此它的升值越高了。现有的加密货币有1500多种,当前有多个国家发行了加密货币。

优得学院第五课:区块链核心成员_第5张图片

从这幅图中我们可以看出货币的发展历程,从早期的纸币,硬币,当然也是现在的主流货币到电子货币再到虚拟货币一直到现在的数字货币或者说加密货币,看一下早期的纸币硬币本质上是一种所有者与市场关于交易权的契约,根本上是所有者相互之间的约定,是物品流通的媒介,或者说等价物,这一类货币主要以美元为代表,包括像人民币,欧元,英镑等等。

第二类是电子货币,电子货币与实物货币可以相互转换,我们需要向电子货币的发行者主要是银行支付实物货币才能获取等量的电子货币。

第三类是虚拟货币,虚拟货币本质上不是货币,不具备货币的基本属性,它实际上是一种商品,它是应用平台发行的,比如说腾讯公司发行的q币,只能从法币向虚拟货币单向的流通,不能再把虚拟货币兑换成法币。

那么我们现在所说的加密货币或者数字货币是一种无中心化的发行机构通过计算机程序和一定的机制发行的货币,并通过技术保证货币发行量及交易安全性,数字货币通常叫做密码货币或者加密货币,应该说以加密货币为代表的数字货币引起各个政府和央行的高度重视。

我们国家的央行也就是中国人民银行也于2017年成立了数字货币研究所,今年两会的时候前央行行长周小川也明确表示中国会发行自己的数字货币,当然是不是类似于采用区块链技术的比特币以太坊的加密货币,现在还不得而知。

优得学院第五课:区块链核心成员_第6张图片

三、加密私钥

关于加密私钥,我们有两个问题需要回答,第一个问题私钥为什么要加密?第二个问题是私钥如何加密?首先是私钥为什么要加密?这是因为在加密货币中,资金的控制取绝于相应私钥的所有权和控制权。

在加密货币交易中,私钥用于生存支付加密货币所必需的签名以证明对资金的所有权。私钥必需始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的加密货币也拱手相让了。私钥还必需进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,没有一个中心化机构保存备份的私钥,其所保护的加密货币也将永远丢失。

那我们就知道了私钥必须要保密, 但是私钥这种机密性在实践中是相当难以实现的,因为这个需求与另外一个同样的重要需求可用性之间是相互矛盾的,当你需要为了避免私钥丢失而储存备份的时候,你会发现维护私钥的机密性是一件想当困难的事情,后续还会讲的。

优得学院第五课:区块链核心成员_第7张图片

那么到底如何加密私钥?

一种简单的做法是通过密码加密存有私钥的钱包,这是一种方法,同时对钱包也要进行备份,为什么?因为当用户生成或重装钱包的时候,需要把密钥从一个钱包转移到另一个。

还有一种方案是把私钥储存在纸张上面,或者叫纸钱包,或者是外部的存储介质,比如说u盘备份,但这也存在一个问题,就是一旦这个存储介质纸也好u盘也好,一旦丢失或者失窃,也会造成私钥失密。

目前比较主流的做法是采用这个BIP0038,BIP是比特币改进提议,那么指的是比特币社区成员所提交的一系列改进比特币的提议BIP0038是关于改进私钥加密的提议,这里面主要通过口令来加密私钥,然后再进行一个Base58Check的一个编码。

那么它的方案是这样的几个步骤,第一个步骤是输入比特币的私钥,通常是WIF,也就是钱包导入格式编码,采用这种方式编码,然后再输入一个长密码作为口令,对比特币私钥进行加密,这里面的长密码通常由多个单词或一段复杂的数字字母字符串组成,又称作助记词。

那么BIP0038加密方案的输出是由一个Base58Check编码过的加密私钥,前缀为6P。因此说,如果看到一个6P开头的密钥,这就意味着密钥是被加密过的,需要一个口令来转换,这个口令就是我们前面讲的这个助记词,然后解密出来的就是可以被任何钱包可接受的WIF格式的私钥,那么它的前缀是5,也就是这样的一个字符串,这就是一个私钥。

那么许多钱包app现在都能够识别BIP0038加密过的私钥,并且要求为用户提供口令,也就是助记词来解码并导入密钥。加密过的私钥只有用对应的密码才能解开,这样的好处是就算这个加密密钥被盗了,只要这个密码够长够随机,短时间内私钥也不会泄露,可以有充足的时间来转移财产。

实际上助记词就是一种明文的私钥,可以等同于私钥,它的好处是用多个这样的单词代替一大串01的二进制这个私钥方便记忆和备份,因此建议大家使用数字货币的时候,一定要把助记词记在纸上面保存好,不要存储在机器上面。

当然助记词还有一个好处,恢复钱包方便,只要导入私钥就好了,它的坏处是一旦丢失就跟丢失私钥是一样的,因此将来大家使用助记词的时候,网络上凡是要填写私钥或者助记词的地方一定要慎重,曾经就有人不小心把助记词发到微信群里面,造成加密货币的丢失。

四、多重签名和P2SH

传统的比特币地址中,每一个地址都有一个对应的私钥,可以称为单签名交易,因为转账只需要一个签名,什么签名?就是来自与比特币地址相关的拥有者的签名,显然单签名交易的安全性不高,因此出现了多重签名地址,在多重签名中可以有多个比如说三个相关联的私钥,需要其中的两个以上才能完成一笔转账,实际上你也可以设置成3155116等这样的一个组合形式。

但是最常见的还是三二组合,就是我有三个相关联的私钥,在签名的时候需要提供两个,由于需要通过多方的地址确认,这就需要这些人多方同时合作,这些参与方可以是人,机构或者说程序脚本。

那么关于多重签名的应用,我们这里可以举一个例子,假设你工作的公司想要在全球交易中接收地址,公司出于安全考虑,不想让单独的员工掌握单独的密码,任何一笔交易都需要一个员工以上的认可,这就需要用到多重签名技术。

总的来说,在多重签名技术的应用上,目前主要有两个方面,第一个主要用途保护消费者的权益,相对于单签名而言,多重签名引入了仲裁员的机制,能够引入受信任的第三方参与到交易中,以保障消费者的权益,第二个应用主要是多重签名托管应用到商业之中,把资产分开存放,避开中心化的存储保障中心化的安全,这是关于多重签名。

虽然多重签名十分强大,但是使用起来还是不是很方便,基于之前的脚本,收款方必须在客户付款前将这个脚本发送给每一个客户,而每一个客户也必须使用这个特制的能够产生客户交易脚本的比特币钱包软件,还必须学会如何用脚本来完成交易。

此外由于这个脚本可能包含特别长的公钥,最终这个交易脚本可能是最初交易脚本长度的多倍,甚至5倍或者10倍这样子,额外的长度的脚本给客户造成了费用的负担,还有一点是长的交易脚本一直介入在所有节点的随机存储器的UTXO这个数据集里面,直到这笔资金被使用,因此采用这种复杂输出脚本使得实际交易中变得困难重重,有什么办法呢?

有一种办法叫做P2SH(Pay-to-Script-Hash),P2SH正是为了解决实际难题而被引入的,它主要是复杂脚本的应用,能直接向比特币地址支付一样简单,因为它做了一个相当于对脚本做了一个哈希,把一个非常长的不便交易也浪费存储资源的一个多重签名的脚本,做一个哈希以后,得到一个非常短的这样的一个机制。

这个我们在这里有一个专门的术语,在P2SH的支付中,这复杂的锁链脚本用这个电子指纹所取代,电子指纹是指的密码学中的哈希值,那么关于P2SH的技术细节由于时间的关系就不做过多的展开,大家可以好好查一下资料仔细研读。

五、比特币靓号

优得学院第五课:区块链核心成员_第8张图片

我们知道比特币地址是由数字和字母组成的字符串,这个可记性不强,那么所谓的靓号地址包含了人类可读信息的有效比特币地址,比如说1开头的,然后Love这样的一串,这个地址包含了Love和日常生活中车牌号比如说5个8这类的很类似,靓号地址依靠和其他地址相同的椭圆曲线乘法和SHA256,因此你无法比任何别的地址更容易获得一个靓号头号开头的地址私钥。

那么怎么样才能得到一个想要的靓号呢?

当然有需求就有市场,那些通常无法在比特币挖矿上盈利的矿机被重新赋予寻找靓号地址的任务,用这个GPU系统搜索靓号比通用的CPU快很多个量级,因此需要GPU矿机用来寻找特定的靓号来获取回报,通常指用GPU硬件来为他人寻找靓号地址来获得比特币的矿工为靓号矿工,专门做这件事,靓号地址的安全性和普通地址安全性差别并不大,因为生成过程是一样的。

优得学院第五课:区块链核心成员_第9张图片

六、纸钱包

关于钱包技术后续有专门内容介绍,这里简要的了解纸钱包,在大多数定义下面,纸钱是一个包含所有密钥数据的文件,这些数据用于生成比特币私钥,形成密钥钱包,然而人们通常使用纸钱这个术语以物理文件形式表达比特币离线存储的方式。

纸钱包是打印在纸张上的比特币私钥,有时钱包为了方便起见也包含了比特币地址,这并不是必要的,因为我们知道比特币地址可以从私钥中导出来,纸钱包是一种非常方便的建立备份或者线下存储比特币的方式,这种方式叫做冷存储。

作为备份机制,一个纸钱包可以提供高安全性,以防在电脑硬盘损坏或者失窃,意外删除情况下面造成密钥的丢失,作为一个冷存储的机制,如果纸钱包的密钥在线上生成并永久不再电脑系统中存储的话,他们在应对黑客的攻击,键盘记录器或其他在线电脑威胁具有更强的安全性,所以建议大家还是要采取纸钱包的方式进行冷存储。

优得学院第五课:区块链核心成员_第10张图片

总结回顾

这节课从公钥和私钥以及比特币地址生成出发,介绍了如何生成私钥,如何从私钥通过椭圆曲线乘法算法存储得到公钥,最后如何从公钥通过哈希算法生成比特币地址。

第二个方面学习了加密货币,了解了加密货币的特点以及与现有法币,电子货币,虚拟货币的一个区别。

第三点我们从为什么要对私钥加密和怎么对私钥加密两个方面来了解来学习私钥加密,在此基础上我们了解了多重签名和P2SH,比特币靓号和纸钱包。

本节课介绍的这些技术都是在比特币中用来控制资金所有权的密码学基础技术,希望大家在课后再研读相关资料深入学习掌握相关的知识。好,这节课到此为止,谢谢大家!

想要学习更多区块链知识,请扫码加入:

优得学院第五课:区块链核心成员_第11张图片

你可能感兴趣的:(优得学院第五课:区块链核心成员)