02-BTC-密码学原理

学习视频来源:https://www.bilibili.com/video/BV1Vt411X7JF/?p=2

文章目录

  • [1. 哈希函数](#1. 哈希函数)
    • [1.1 collision resistance](#1.1 collision resistance)
    • [1.2 hiding](#1.2 hiding)
    • [1.3 puzzle friendly](#1.3 puzzle friendly)
  • [2. 签名](#2. 签名)
    • [2.1 比特币账户](#2.1 比特币账户)
    • [2.2 对称加密](#2.2 对称加密)
    • [2.3 非对称加密](#2.3 非对称加密)
    • [2.4 公私钥匙随机源](#2.4 公私钥匙随机源)

比特币中用到了密码学中的2个知识,哈希函数和签名。

1. 哈希函数

比特币被称为是加密货币,但其实加密货币是不加密的,比如:账户地址、金额都是公开的。密码学中用到的哈希函数被称为Cryptographic hash function。它有2个重要的性质 collision resistance 和hiding。

1.1 collision resistance

这里的collision 是指哈希碰撞。如果2个输入x和y,满足x不等于y,但H(x) = H(y),那么就说明发生了哈希碰撞。collision resistance 是指没有什么高效的方法,人为的制造哈希碰撞。给定一个x,没有什么高效的办法找到y,使得H(x) = H(y)。这条性质可以用来对message做digest,如用H(message) = digest来检测message是否被篡改。如果有人改了message内容,digest就会发生变化。没有办法高效的篡改内容,而保持digest不变。

没有那个哈希函数可以证明是collision resistance的,只能靠长期的实践检验,很多的密码学专家都找不到高效的方法,就认为这个哈希函数是collision resistance。以前MD5也被认为是collision resistance的。但后来找到了人为制造哈希碰撞的方法。

1.2 hiding

哈希计算是单向的,即给出X,可以计算出其哈希值,但给出哈希值,没办法计算出X。哈希值没有泄露X的任何信息,除非蛮力破解,前提是输入的空间要足够的大,分布比较均匀。

collision resistance 和hiding结合在一起,用来实现 digital commitment或叫digital equivalent of a sealed envelope。

1.3 puzzle friendly

比特币中用到的哈希函数除了要求满足上面2个性质,还要求 puzzle friendly。即哈希值的计算,事先是不预测的,光看这个输入,很难看出来它最后的哈希值是什么。如果你想要算出来的哈希值是落在某个范围之内的,那没什么高效的办法,只能一个一个去试试,看哪个输入的哈希值,恰好落在这个范围之内。比如说你想得到一个哈希值,前面k位都是0,0000000...XXXXX,即这个哈希值小于某个目标值,你是没办法提前知道哪些输入的哈希值前k位都是0。比特币挖矿用的POW算法就是利用了这个性质。挖矿需要找到一个nonce,nonce需要和区块头其他信息合起来,一起计算一个哈希,哈希值大小要满足一个阈值。

复制代码
	H(block header)<= target 

这个nonce只能蛮力去找,需要花费一定的时间,但一但找到,其他人可以很快验证是否正确。这个性质被称为diffect to solve,but easy to verify.

比特币中用到的哈希函数SHA256(Secure Hash Alogrithm), 满足以上3个性质。

2. 签名

2.1 比特币账户

现实生活中想要开一个账户,比如开一个银行账户,是需要去银行办理开户手续的,这就是中心化系统的开户方式。比特币是去中心化的,每个用户自己开户,不需要任何人批准,只需要创建一个公私钥对(public key, privatge key),就是一个账户。公私钥对来自与非对称加密。

2.2 对称加密

A和B通信,A和B提前商量一个密钥key。A将要发送的消息用key加密,发送给B;B收到后用key解密。因为加密和解密用的都是同一个key,所以称为对称加密。这种加密方式安全的前提是存在一种安全的方法,将密钥分发给通信的双方。弱点是密钥的分发不是很方便,所以提出了非对称加密。

2.3 非对称加密

非对称加密,加密用的是公钥,解密用的是私钥。A要给B发消息,A用B的公钥将消息加密,B收到后用自己的私钥解密。加密和解密用的是同一个人的公私钥。这么做的好处是公钥是不用保密的,可以告诉所有的人;私钥需要保密,但是只需要保存在本地就行,不用传给对方。这就解决了对称加密中 密钥分发不方便的问题。

2.4 公私钥匙随机源

如果一个人本地不停的生成公私钥对,然后和比特币上其他账户的公钥比对,如果发现和某个人公钥一样,就可用私钥把这个人的比特币转走,这种方法理论上是可行的。但如果用的是256位的哈希值,生成相同公私钥对相同情况概率,比地球爆炸的概率还要低,目前世界上还没发现这种情况。因为公私钥的过程是随机的,所以在生成公私钥的时候,需要选择一个好的随机源。比特币中的签名算法不光是生成公私钥对的时候要用好随机源。之后每一次签名的时候,也要用好的随机源,不然有可能会泄露公钥,就全完了。

相关推荐
ZDGJ60999 小时前
新手小白了解国际期货先了解哪一步
区块链
小静AI工程实验室1 天前
MD5 算法详解:哈希原理、标准向量、输入编码与安全边界
算法·安全·哈希算法·md5
重生之小比特1 天前
【C++进阶】unordered_set 和unordered_map 深度解析
c++·哈希算法
重明链迹实验室2 天前
重明链迹丨每周区块链安全要闻(0921-0927)
安全·web3·区块链
黄金龙PLUS2 天前
5个1024比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
another heaven8 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
甜到心里的蛋糕8 天前
加解密技术详解:纯前端如何实现 AES / SM4 / RSA / 国密 SM2
前端·密码学
AIFQuant9 天前
ETF行情API接入踩坑记:从报错到跑通的七个问题
python·金融·区块链·etf·基金
磐链科技9 天前
DApp 前端开发指南:钱包连接与链上数据交互实践
区块链·智能合约