【区块链】复习三之密码学基础

1、哈希函数

什么是哈希函数?哈希函数性质?典型哈希函数?区块链中的哈希函数?
哈希函数又称散列函数、散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法(维基百科)
H(M):M任意长度,输出固定长度

1.1哈希函数性质

1)正向快速
给定明文,哈希函数在有限的时间和有限的资源内能计算出哈希值
2)逆向困难
给定哈希值,在有限的时间内基本不可能逆推出铭文
哈希函数要达到逆向困难,需要满足如下条件:
①输入空间要足够大
②分布尽可能均匀
可以防篡改
3)输入敏感
对输入进行任何修改,产生的哈希值一般有很大不同。方便快速检测信息是否被篡改。(雪崩效应)
4)冲突避免/抗碰撞性
很难找到两段内容不同的消息,使他们的哈希值一样(哈希碰撞)
①弱抗碰撞性:给定明文的前提下,无法找到与之碰撞的其他明文
②强抗碰撞性:无法找到任意两个发生hash碰撞的明文
5)谜题友好性
哈希值的计算是不可预测的,而如果想要知道H(x)落在某个范围之内,没有什么好的办法,只能逐个尝试。
用处:挖矿很难,验证很容易

1.2典型哈希函数

MD系列(信息摘要)和SHA系列(安全哈希算法)
比特币中所使用的主要哈希函数是SHA-256
比特币系统在生成地址的过程中使用RIPEMD160

1.3哈希函数在区块链中的使用

1.3.1数据加密

1)检测区块是否被篡改
区块的哈希值能够唯一而精准地标识一个区块。
2)保护收款方公钥
利用哈希函数将公钥转变成更短地地址用于收款,且从地址无法逆推出公钥。

1.3.2挖矿

挖矿是指:区块头中有个参数叫nonce,寻找这个随机数使得区块哈希值符合目标值地过程就是挖矿。
矿工激励机制,货币发行机制

2、加密算法

对称加密算法和非对称加密算法

2.1对称加密算法

加密和解密使用相同的密钥,或是使用两个可以简单地互相推算的密钥
如凯撒密码
优点:简单易理解,加密解密速度快
缺点:密钥分发不方便,需要提前有安全地方式分发密钥;更改密钥也不方便

2.2非对称加密算法

公钥加密,私钥解密
公钥和私钥不同或者很难互相推到
如RSA(基于大素数分解较难) ECC(基于椭圆曲线数学)
RSA地数学计算原理相对简单,相比于ECC更被广泛接受

2.2.1椭圆曲线加密算法ECC

例子(假设不会除法):私钥d456 基点G123 公钥Q=d*G=56088
A想要传输消息67给B:
①先用B的公钥对67进行加密:123222(未知随机数)=27306
56088
222+67=12451603
②B开始解密:2式-1式*456=消息

2.3公私钥

2.3.1私钥

私钥是一个随机数,可以抛硬币256次获得,也可以使用编程语言获得,使用SHA256算法对某个数据求其哈希值获得
如果私钥的产生有好的随机源,则产生相同私钥的概率极低,所以为了账户的安全性,最好选择好的随机源

2.3.2公钥

公钥由私钥经非对称加密算法产生。对于给定的私钥,ECC算法可产生一个椭圆曲线上的一个点,该店的坐标(x,y)就是对应的公钥。
公钥的两种表示形式
非压缩形式(前缀04表示是非压缩形式,占用字节较多,采用较少)、压缩形式(椭圆曲线关于x轴对称,所以每个x对应两个可能的y,用不同的前缀表示不同的y)

发送消息或者支付货币时,用对方的公钥加密;接收消息或者货币时,用自己的私钥解密。

2.3.3地址

地址由公钥产生
由于公钥较长,可以将其压缩成更短的形式,该形式称为地址。地址中一般去掉相似的字母,如0OIl.
地址是由公钥压缩得到的,所以无法从地址逆推出公钥。
在这里插入图片描述
①公钥哈希:更短更易传输,更安全,没有直接给出原始公钥
②版本号:用于表明具体采用的是哪一种锁定脚本
③校验码:数据中的一小部分,可用于检测剩余数据是否正确
④Base58编码:用于产生比特币的钱包的地址(避免混淆、没有标点符号、大部分软件支持双击选择整个字符串)

公钥和地址本质上都是由私钥得到,所以只需要记住私钥就可以,但是在日常使用中,为了方便一般记住私钥和地址。

3、数字签名

使用公钥加密领域的技术,用于鉴别数字信息的方法。
在不提供私钥的基础上“解锁”货币,向所有人证明自己拥有该地址的私钥。
数字签名可用于证明拥有该地址的私钥,同时又避免泄露私钥。
数字签名是和交易绑定的,通过私钥和交易数据一起产生的。

数字签名的创建和使用流程:
①创建数字签名:将私钥和交易数据一起输入某个数字签名算法,产生一个数字签名
②验证数字签名:对数字签名、交易数据和公钥做一些数学运算,运算的结果可以确认上述的数字签名是否正确

3.1椭圆曲线数字签名算法

①签名过程
私钥d;消息的哈希z=h(M);随机数k;基点G
·R=kG
·r=Rx
·s=k^(-1)(z+dr)mod n
最终产生签名[r,s]

②验证过程
公钥Q;消息的哈希z=h(M);数字签名[r,s];基点G
P1=(s^(-1)z)G
P2=(s^(-1)r)Q
R=P1+P2
如果Rx=r,则验证通过

猜你喜欢

转载自blog.csdn.net/RuRu_Bai/article/details/124236440