signature
1.公钥和私钥
对称密码由于只有一把密钥,加密和解密都是用同一把密钥,那么很容易受到MIMT攻击,中间人受到一方的信息,就可以用密钥解密,然后随便伪造信息,篡改信息。非对称密码用到了两把密钥,公钥和私钥,一把用于加密,一把用于解密,但是具体哪一把加密要视情形而定,但是,如果一把用于加密,那么另一把一定用于解密
对称密码由于只有一把密钥,加密和解密都是用同一把密钥,那么很容易受到MIMT攻击,中间人受到一方的信息,就可以用密钥解密,然后随便伪造信息,篡改信息。非对称密码用到了两把密钥,公钥和私钥,一把用于加密,一把用于解密,但是具体哪一把加密要视情形而定,但是,如果一把用于加密,那么另一把一定用于解密
1.传输信息(公钥加密)
假设Bob有两把密钥,公钥和私钥,
当有人想要给他发信息的时候,都可以用公钥加密,但只有他能用私钥解密
只要私钥不泄露,那么这个信息就是安全的,没有任何人能篡改
2.数字签名(私钥加密,公钥解密)
那么当Bob要给别人回信的时候,由于别人没有私钥,那该怎么保证信息的安全性呢?
Bob可以用Hash函数生成message的digest
由于Hash函数的雪崩效应,但凡改动一个message,digest就会完全不同
因此对方可以通过计算message的digest来验证信息是否被篡改
但是,如果明文发送message+digest,那不行,因为还是会有MIMT攻击,中间人可以拦截message和digest,把修改完后的给对方
Alice 发:
m = "I owe you $100", digest = H(m)
攻击者截取后改成
m' = "I owe you $0", digest' = H(m')
Bob 收到 m', digest',完全能通过哈希验证 ✅
但根本不知道是不是 Alice 发的 ❌
因此Bob需要用私钥加密digest,对方用公钥解密digest,验证message的digest,这样中间人是无法修改的,因为中间人没有私钥
3.数字证书
但是可能会有人冒充Bob,发送另一个公钥给Alice,那么这样还是会出问题
所以Bob和Alice需要找到certificate authority,简称CA,为公钥做认证
CA用自己的私钥,给Bob的公钥加密,生成证书
然后Alice只需要用CA的公钥,解密,就能验证Bob的公钥是否来自Bob
2.ECDSA
生成签名
1.找一个椭圆曲线
\[ y^2 = x^3+ax+b \mod p \]
基点G,阶数n,以上这些参数都是公开的
2.生成私钥\(d_A\),公钥\(Q_A\)
\[ d_A \in [1,n-1] \]
\[ Q_A = d_AG \]
这个椭圆曲线是选定安全的椭圆曲线,DLP是非常困难的问题,从\(Q_A,G\)几乎不可能回复私钥
3.计算hash
\[ e = Hash(m) \]
这里要注意,如果e的位数大于n的位数,那么要截断高位 \[ e >> (hlen - nlen) \]
4.生成随机数k
计算 \[ kG=(x_1,y_1) \]
5.取模得到r
\[ r \equiv x_1 \mod n \]
6.得到签名
\[ s \equiv k^{-1}(e+rd_A) \mod n \]
验证签名
1.计算
\[ u_1 = es^{-1} \mod n \]
\[ u_2 = rs^{-1} \mod n \]
2.凑
\[ u_1G+u_2 Q_A = s^{-1}(e+rd_A)G = kG=(x_1,y_1) \mod n \]
3.验证
\[ r = x_1 \mod n \]