公钥和私钥的原理
一般私钥方要想和其他人进行通信,会自己保留一份私钥,然后发给他人公钥。
+------------+ +---------------+
| Public key | | Private key |
+------------+ +---------------+
+--------------+ +---------------+
| Message | send | Message |
| encrypt by |>------------------------------>| decrypt by |
| public key | | private key |
+--------------+ +---------------+
- 持有公钥方,若要发信息给私钥方,首先要经过公钥加密,再发送。
- 信息到达后,私钥方通过私钥解密获取信息内容。
此时,只要私钥不泄漏,这段信息就是安全的,即使被第三方拦截,依旧无法解密。
+------------+ +---------------+
| Public key | | Private key |
+------------+ +---------------+
+-------------+ +---------------+
+->| Signature | | Message |
| | decrtypt by | +---------------+
| | public key | v
| +-------------+ |
| v Hash
| | |
| v v
| +-------------+ +---------------+
| | Digest | (Is same digest?) | Digest |
| +-------------+ +---------------+
| ^ v
| | |
| ^ Encrypt by priave key
| +------------+ |
| | Message | v
| | decrypt by |<-+ +---------------+
| | hash | | | Signature |---+
| +------------+ | +---------------+ |
| | |
| +------------+ | +---------------+ |
| | Message |--+ | Message | |
| | + |<------------------------------<| + | |
+--| Signature | | Signature |<--+
+------------+ +---------------+
- 持有私钥方,采用
数字签名
,发送信息。 - 首先要Hash函数将信息生成摘要。
- 然后用私钥对这个摘要加密,生成
数字签名
。 - 最后将生成的
数字签名
附在信息下一并发送。 - 持有公钥方收到内容后,用公钥解密
数字签名
,获得摘要。由此证明私钥方的身份。 - 接着再对信息本身使用Hash函数,同样得到一份摘要。
- 将这两份摘要进行对比,验证是否一致,证明信息未被修改。
这个时候,第三者出现。持有公钥方的公钥被第三者的公钥偷偷替换。
第三者用自己的私钥做成数字签名,和公钥方进行通信。
此时,持有公钥方完全不知情,以为自己仍然持有原有公钥和私钥方通信。
实际上却是使用第三者的公钥与第三者进行通信。
当公钥方无法确定自己的公钥是否属于私钥方的时候,此时可以寻求私钥方的证书中心
(Certifiacte Authority, CA),为公钥做认证。
证书中心用自己的私钥,对私钥方的公钥和一些信息一起加密,生成数字证书
(Digital Certificate)。
得到数字证书
之后,私钥方以后再和公钥方通信的时候,只要在签名后再附上数字证书
。
公钥方收到信息后,用CA解开数字证书
,就可以获得私钥方真实的公钥,随后就可以证明数字签名
是否真的是私钥方的。
HTTPS中的应用
https协议主要用于网页加密。
- 首先,客户端想服务端发送加密请求。
- 服务端用自己的私钥加密网页后,连同本身的
数字证书
,一并发送给客户端。 - 客户端的
证书管理器
中会有受信任的根证书颁发机构
列表。客户端根据这张表,查看解开数字证书的公钥是否在列表中。 - 如果数字证书记载的网址和你正在浏览的网址不一致,就说明这张证书可能被冒用,客户端发出警告。
- 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
- 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥对信息进行加密,然后与服务器交换信息。
参考链接: