1.公钥和私钥

对称密码由于只有一把密钥,加密和解密都是用同一把密钥,那么很容易受到MIMT攻击,中间人受到一方的信息,就可以用密钥解密,然后随便伪造信息,篡改信息。非对称密码用到了两把密钥,公钥和私钥,一把用于加密,一把用于解密,但是具体哪一把加密要视情形而定,但是,如果一把用于加密,那么另一把一定用于解密

对称密码由于只有一把密钥,加密和解密都是用同一把密钥,那么很容易受到MIMT攻击,中间人受到一方的信息,就可以用密钥解密,然后随便伪造信息,篡改信息。非对称密码用到了两把密钥,公钥和私钥,一把用于加密,一把用于解密,但是具体哪一把加密要视情形而定,但是,如果一把用于加密,那么另一把一定用于解密

1.传输信息(公钥加密)

假设Bob有两把密钥,公钥和私钥,

ChatGPT Image 2025年7月17日 10_12_21

当有人想要给他发信息的时候,都可以用公钥加密,但只有他能用私钥解密

ChatGPT Image 2025年7月17日 10_20_59

只要私钥不泄露,那么这个信息就是安全的,没有任何人能篡改

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

ChatGPT Image 2025年7月17日 10_44_26

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 \]