数字签名、证书和通信加密

297 阅读3分钟

0. 两把钥匙

鲍伯有两把钥匙:一把公钥、一把私钥。
新建项目 (2).png


鲍伯把公钥分享给了任何有需要的人,但是私钥只在自己手上。

image.psd.png
鲍伯的密钥公钥有这样的特征:
特征1.明文可以用公钥加密,只有私钥可以解出

graph LR
明文 --公钥--> 密文 --私钥--> 明文&nbsp

特征2. 明文也可以用私钥加密,公钥可以解出

graph LR
明文 --私钥--> 密文 --公钥--> 明文&nbsp



1. 爱丽丝和鲍伯通信

有了上面两个特征,爱丽丝和鲍伯可以通信了,他们是这样进行的:
1). 爱丽丝利用特征1给鲍伯写信:写完信后,用公钥加密。
鲍伯收到信后利用特征2读信:用私钥解开,读到爱丽丝的信里的内容。

整个流程是这样的:

graph LR
爱丽丝的明文 --公钥--> 爱丽丝的密文 --鲍伯用私钥--> 爱丽丝的明文&nbsp


2). 鲍伯回信:由于没有保密机制(大家都有公钥),鲍伯的回信没必要全部加密(毕竟很费CPU)。鲍伯退而求其次,只要确保信的内容不被人篡改(签名机制)。他是这么做的:对回信的内容生成sha256摘要,只对摘要进行加密。这就是数字签名。鲍伯把回信明文数字签名一起发给了爱丽丝。

graph LR
鲍伯的明文 --sha256--> 摘要 --鲍伯的私钥--> 数字签名&nbsp--发送--> 爱丽丝
鲍伯的明文 --发送--> 爱丽丝


3). 爱丽丝收到回信:采用和鲍伯同样的方法,得到回信的摘要。把这个摘要与数字签名解密的结果进行比对,发现确实是鲍伯发过来的。

graph LR
鲍伯回信的明文 --sha256--> 摘要-->比对
数字签名 --公钥--> 摘要&nbsp-->比对

至此爱丽丝和鲍伯完成了一完次整的通信,但是好景不长,意外发生了...

2. 伊夫的诡计

伊夫想冒充鲍伯,他潜入爱丽丝的电脑,偷偷把鲍伯的公钥换成自己的公钥,爱丽丝毫无察觉(毕竟公钥看上去只是一串无意义的随机数),伊夫就可以冒充鲍伯给爱丽丝写信了。比如现在爱丽丝写信的时候就变成这样了:

graph LR
爱丽丝的明文 --伊夫的公钥--> 爱丽丝的密文 --伊夫用私钥--> 爱丽丝的明文&nbsp

后来,人们发明出数字证书这个东西。数字证书里除了有上面提到的公钥,还有关于公钥持有人的一些身份信息,比如鲍伯的家庭住址、联系电话等。
数字证书的几个重要特点:
1. 证书链机制:证书是从证书签发机构(CA)的根证书签发下来的,可能经历多个中间证书,形成完整的证书链;
2. 证书内容:持有人的重要信息比如DNS Name(域名)公钥、对重要信息生成的摘要后用CA签名
3. 由权威CA签发:证书一般都是由权威CA签发,自签发的证书不被默认设备(因为我们PC、手机上出厂时只默认存在几个权威CA根证书)认可。

于是伊夫的诡计被这样破解: 鲍伯向权威CA申请证书,以后写信的时候,除了签名,再附加上自己的数字证书。爱丽丝收到信后,首先验证证书合法性,再验证信件的合法性。相当于多了一步验证证书合法性

graph LR
鲍伯的明文 --sha256+鲍伯的私钥--> 数字签名--发送--> 爱丽丝
鲍伯的明文 --发送--> 爱丽丝
鲍伯的证书 --发送--> 爱丽丝

验证证书合法性流程这里不细展开,概略来讲就是比对证书是否是本地信任根证书的子证书。 image.png

3. 鲍伯也要隐私

由于鲍伯的公钥是公开的,所以所有鲍伯的信的内容都会被别人解出,那有没有办法只能爱丽丝能看到呢?

有一种方法是配合另一个对称加密算法(如AES)对信件内容进行加密。
通信前,两者先约定好一个暗号(AES密钥),后面信件内容就用这个暗号加密和解密。

graph LR
爱丽丝生成暗号 --伊夫的公钥--> 暗号的密文 --伊夫用私钥--> 暗号

鲍伯 --> 爱丽丝

graph LR
鲍伯的明文 --暗号--> 鲍伯的密文

爱丽丝 --> 鲍伯

graph LR
鲍伯的密文 --暗号--> 鲍伯的明文

4. 尾声

总结一下
0节介绍了一种非对称加密如RSA;
1节介绍了数字签名机制
2节引入了数字证书
3节是一种复合通信加密机制,HTTPS的基本原理就是这样的。