比特币中的密码学

aTuReader
aTuReader
在进行交易的时候,公钥是不用保密的,私钥要保密但是私钥只要保存在本地就行,不用传给对方,而公钥可以公开,在进行交易的时候,个人采用私钥对信息进行签名,其他人采用公钥进行验证签名。

正式进入到区块链的入门学习,之后会连续更区块链的相关笔记。Reader此次分享的是肖臻老师《区块链技术与应用》公开课的第一讲。本讲主要设计BTC中的「密码学原理」相关知识,包括哈希和签名两个功能。

哈希函数

密码学中用到的哈希函数被称为cryptographic hash function,它有两个重要的性质:「collision resistance」和「hiding」以及「puzzle friendly」。

collision resistance

这里指哈希碰撞,例如给定两个数x和y,当x≠y时存在H(x)=H(y),就是两个不同的输入,输出却是相等的,这就称哈希碰撞。哈希碰撞是不可避免的,因为输入空间远远大于输出空间。哈希碰撞无法人为制造,无法验证,是根据实践经验得来的,无法用数学理论证明出来。就是说给出x,很难找到y,使得两者的哈希值相同,除非「蛮力求解」(brute-force),但基本上是不可能求解出来的。

该性质的作用:对一个message求digest。比如message取m,m的哈希值是H(m)=digest,如果有人想篡改m值而H(m)不变,则无法做到,篡改之后一定会被发现。可以用到实际,比如文件修改或者上传,计算哈希值并保存,查看前后两个哈希值是否相同。当哈希碰撞能够人为制造的话,哈希函数就失去了意义,比如MD5已经能够人为的制造哈希碰撞。

hiding

讲的是哈希函数的计算过程是单向的,不可逆的,从H(x)无法推导出x。hiding性质前提是输入空间足够大,分布比较均匀。如果不是足够大,一般在x后面拼接一个随机数,如H(x||nonce)。

该性质的作用:和collision resistance结合在一起,用来实现digital commitment(又称为digital equivalent of a sealed envelope)。

比如进行结果预测的时候,如果提前将预测结果公布,就会导致人们可以做出选择,来推动结果的走向,如何在不公布结果而又验证自己预测的结果是否正确,把预测结果作为输入x,算出一个哈希值,将哈希值公布,之后再将实际结果进行求取哈希值,并比较,hiding让人们知道哈希值而不知道预测值,最后再将x公布,因为有collision resistance的性质,预测结果是不可篡改的,也而已保证可信度。

puzzle friendly

除了密码学中要求的这两个性质外,比特币中用到的哈希函数还有第三个性质,也就是puzzle friendly,指的是哈希值的预测事先是「不可预测」的。就是在进行输入时,输入的值是无法进行预测的,例如如哈希值是00...0XX...X组成,事先无法知道哪个值更容易算出这个结果,还是要一个一个测试寻找输入值。

比如,比特币挖矿的过程中实际就是找一个nonce,block header指块头,块头里有很多域,其中一个域是我们可以设置的随机数nonce,nonce跟区块的块头里的其他信息合一起作为输入,得出的哈希值要小于等于某个指定的目标预值。H(block header)≤target。挖矿的过程是不停的试「随机数」,使得block header取哈希后落在指定的范围之内。

puzzle friendly是指挖矿过程中没有捷径,为了使输出值落在指定范围,只能一个一个去试。所以这个过程还可以作为工作量证明(proof of work)。挖矿很难,验证很容易,就是在找到nonce时,直接进行哈希值计算就可以比较。

比特币中用的哈希函数叫作SHA-256(secure hash algorithm)以上三个性质它都是满足的。

签名

加密体系

对称加密:人之间信息的交流可以利用密钥(encryption key),A将信息加密后发给B,B收到后用密钥解密,因为加密和解密用的是「同一个密钥」,所以叫对称加密。

对称加密安全的前提是有渠道可以安全地把密钥分发给通讯的双方。因此对称加密的缺点就是密钥的分发不方便,因为在网络上很容易被窃听。

非对称加密:非对称密钥是用一对密钥而「不是一个」,加密用公钥,解密用私钥,加密和解密用的都是接收方的公钥和私钥。

加密体系完成签名

在进行交易的时候,公钥是不用保密的,私钥要保密但是私钥只要保存在本地就行,不用传给对方,而公钥可以公开,在进行交易的时候,个人采用私钥对信息进行签名,其他人采用公钥进行验证签名。

账户管理

其他有中心化的系统中,可以找一个权威的第三方实现账户的开户,但在比特币系统中是去中心化的,所以第三方不太现实,比特币系统中开账户,就是在本地创立一个公私钥对,这就是一个账户。公私钥匙对是来自于「非对称的」加密技术。

公钥相当于银行账号,别人转账只要知道公钥就行,私钥相当于密码,知道私钥可以把账户上钱转走。同时在进行信息发布的时候公钥和私钥用来签名。

例如A想向B转10个比特币,A把交易放在区块链上,别人怎么知道这笔交易是A发起的呢?这就需要A要用自己的私钥给交易签名,其他人收到这笔交易后,要用A的公钥去验证签名。签名用私钥,验证用公钥,用的仍然是「同一个人」的。

同时结合哈希函数的特性可知,创建账户产生相同公私钥的可能性微乎其微,因此大量创建账户来窃取其他人账户是不可行的。

但前提是在产生公私钥时有一个好的「随机源」,好的随机源情况下产生公私钥是随机的,但如果随机源不好,就有可能产生相同的公私钥,造成安全问题。

比特币中用的签名算法,不仅是生成公私钥的时候要有好的随机源,之后每一次签名时也要有好的随机源。因为只要有一次签名用的随机源不好的话,就有可能泄露私钥。

THEEND

最新评论(评论仅代表用户观点)

更多
暂无评论