区块链100问之加密算法
文章目录
算法>哈希算法是什么?有什么特征?
答:算法>哈希算法是将任意长度输入的字符串/文件/数据(message) 经过复杂变换,变成以固定长度输出的哈希值。(或叫做消息摘要和指纹)
y = H ( x ) H : 压缩映射 ( 多对一 , 即及可能出现哈希冲突 ) ∣ Y ∣ < ∣ X ∣ ( y 的空间远小于 x 的空间 ) y 的输出长度与 x 无关 y=H(x)\\ H: 压缩映射(多对一,即及可能出现哈希冲突)\\ |Y|<|X| \ (y的空间远小于x的空间)\\ y的输出长度与x无关 y=H(x)H:压缩映射(多对一,即及可能出现哈希冲突)∣Y∣<∣X∣ (y的空间远小于x的空间)y的输出长度与x无关
特征:
- 正向计算简易便捷
- 逆向计算困难且复杂(不可逆)
- 异入异出:尽量单调
- 对输入敏感(x改变很小,y改变会很大)
有人就会问了,逆向困难那么哈希函数加密的密码我们是如何验证的,答案就是每次输入同样的内容(密码)走一遍加密流程,得到结果一样则验证成功。
哈希碰撞是什么?雪崩效应呢?如何解决?
答:不同的输入经过函数H(x)却得到了相同的哈希值。
雪崩效应:明文微小的区别会导致哈希值非常明显的区别。
解决:
- 链地址法
-
开放地址法
思想:一旦发生冲突,就去寻找下 一个空的散列表地址,只要散列表足够大,空的散列地址总能找到。
算法>哈希算法的作用?
答:
- 消息认证:相同消息产生的Hash值相同
- 产生单向口令文件:OS中存储口令的Hash值,输入口令转换成Hash值进行比对
- 入侵检测和消毒检测:每个文件的Hash值存储在安全系统中,随后重新计算可以判断文件是否被修改过
- 产生伪随机数:基于Hash函数的PRF可用于对称密码中的秘钥产生
对称加密和非对称加密有什么区别?
答:
加密过程:数据 + 密钥 = 密文
解密过程:密文 - 密钥 = 数据
-
对称加密:
-
使用一个秘钥加密,必须使用相同的秘钥才解密。(可逆 VS哈希)
-
常见算法:DES、3DES、Blowfish
-
-
非对称加密:
加密和解密使用不同的秘钥,公开的为公钥,私有的为私钥。
-
优点:公钥被获取,没有私钥仍无法破解。
-
常见算法:RSA、DSA、ECC
-
流程:拿到A公钥的任意人可以用公钥加密,A接收到后用私钥解密。
-
为什么会引入非对称加密?
答:对称加密有三困难:扩展困难;身份认证困难;秘钥配送问题困难
解决:
-
事先共享密钥
-
通过密钥分配中心解决
-
Diffie-Hellman密钥交换:双方使用各自的私钥和对方的公钥来计算一个共享的密钥
-
通过公钥密码解决:非对称加密
公钥密码的难题来自哪里?
答:
- 大整数因子分解问题IFP
- 离散对数问题DIP
RSA算法的流程是什么?有什么缺点?
答:
流程:
-
加密:对明文m进行加密(e,N)得到密文c
m e m o d N = c m^emod \ N=c\\ memod N=c -
解密:密文c解密(d,N)得到明文m
c d m o d N = m c^dmod\ N=m cdmod N=m
缺点:公钥认证的问题;速度处理太慢。
什么是数字签名?是通过解密验证吗?什么是证书?
答:
-
为了向别人证明自己的身份,需要对文件进行自己的数字签名,签名后可以由任何人用公钥验证。
-
同样在公钥验证,并不是通过解密验证,而是对一段要被签名的数据进行加密后得到的摘要进行验证,具体过程也就是:
- 发送方需要将原始数据和签名一起发送给接收方
- 接收方通过公钥对数字签名解密得到摘要
- 接收方将明文同样用SHA256计算得到摘要信息与解密出的作对比,想吐则报文没有被篡改
-
证书是CA对公钥进行数字认证的过程(防止私钥泄露)
- CA将他人公钥当做“明文”,用自己的私钥对他人的公钥进行数字签名
- 接收方通过CA的公钥对签名进行解密得到发送方的公钥
其实就是加了一个“中介”来得到认证过的对方的公钥,这个中介值得信任。
椭圆曲线ECC是什么?这怎么可以实现加密?
答:
一条椭圆曲线是指在射影平面上满足威尔斯特拉斯方程(Weierstrass)所有点的集合))
Y 2 Z + a 1 X Y Z + a 3 Y Z 2 = X 3 + a 2 X 2 Z + a 4 X Z 2 + a 6 Z 3 其中系数 a i ( i = 1 , 2 , 3 … 6 ) 定义在某个域上 ( 有理数域 / 无理数域 / 实数域 / 复数域 / 有限域 G F ( p Y^2Z+a_1XYZ+a_3YZ^2=X^3+a_2X^2Z+a_4XZ^2+a_6Z^3\\其中系数 a_i( i=1,2,3…6)定义在某个域上(有理数域/无理数域/实数域/复数域/有限域GF(p Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3其中系数ai(i=1,2,3…6)定义在某个域上(有理数域/无理数域/实数域/复数域/有限域GF(p
注意:
- 椭圆曲线方程是一个齐次方程
- 曲线上的每个点都必须是非奇异的(光滑的),偏导数 Fx(X,Y,Z)、Fy(X,Y,Z)、Fz(X,Y,Z)不同为03.曲线的形状并不是椭圆。
普通方程:
ECC的计算法则?
简述:连线取交点,再取负元。
特殊的:两个垂直点相加为无穷。
扩展相乘 :两个相同点相加则找切线,得到另一个交点,再取负元。
如何实现加密?
选定基点G,每个用户选择一个私钥n
通过私钥 n 产生公钥 P = n G 通过私钥n \ 产生公钥P=nG 通过私钥n 产生公钥P=nG
A向B发送文件流程
-
B用私钥,生成公钥
P B = n b × G P_B=n_b\times{G} PB=nb×G -
A产生随机数k,使用B的公钥加密,并对于密文M生成点对
{ k G , M + k P B } \{kG,M+kP_B\} {kG,M+kPB} -
B拿到点对使用自己私钥进行核验
( M + k P B ) − n b × ( k G ) = M + k × n b × G − n b × k × G = M (M+kP_B)-n_b×(kG)=\\M+k×n_b×G-n_b×k×G=M (M+kPB)−nb×(kG)=M+k×nb×G−nb×k×G=M
总结:谁查看文件谁需要生成公钥P,本质上是应用了Abel群运算的可交换性