公钥和私钥

公钥和私钥的原理

一般私钥方要想和其他人进行通信,会自己保留一份私钥,然后发给他人公钥。

 +------------+                                  +---------------+
 | 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协议主要用于网页加密。

  • 首先,客户端想服务端发送加密请求。
  • 服务端用自己的私钥加密网页后,连同本身的数字证书,一并发送给客户端。
  • 客户端的证书管理器中会有受信任的根证书颁发机构列表。客户端根据这张表,查看解开数字证书的公钥是否在列表中。
  • 如果数字证书记载的网址和你正在浏览的网址不一致,就说明这张证书可能被冒用,客户端发出警告。
  • 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
  • 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥对信息进行加密,然后与服务器交换信息。

参考链接:

  • 数字签名是什么? - 阮一峰的网络日志

Season'neko https://xnix.me/gong-yao-he-si-yao/

你可能感兴趣的:(公钥和私钥)