明文通信的弊端

  1. 冒充
  2. 窃听
  3. 篡改
flowchart LR
    id1(A)-- 我是A今晚7点小树林见 -->id2(B)
    style id1 fill:#f9f,stroke:#333,stroke-width:4px
    style id2 fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5

冒充:

flowchart LR
    id3(C)-- 我是A今晚7点小树林见 -->id2(B)
    style id3 fill:#49a,stroke:#333,stroke-width:4px
    style id2 fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5

窃听:

flowchart LR
    TXT(我是A今晚7点小树林见)
    id1(A) --- TXT -->id2(B)
    TXT --窃听--> id3(C)
    style id1 fill:#f9f,stroke:#333,stroke-width:4px
    style id2 fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
    style id3 fill:#49a,stroke:#333,stroke-width:4px
    style TXT stroke-width:0

篡改:

flowchart LR
    TXT(我是A今晚7点小树林见)
    id1(A) --- TXT --> id2(B)
    id3 --我是A今晚9点点小湖边见--> TXT
    TXT --截获--> id3(C)

    style id1 fill:#f9f,stroke:#333,stroke-width:4px
    style id2 fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
    style id3 fill:#49a,stroke:#333,stroke-width:4px
    style TXT stroke-width:0

  • 对称密钥:指通信的双方使用同一个密钥进行加解密。
  • 非对称密钥:成对出现,一个称为公钥,可对外公开。一个称为私钥,仅自己持有。

对称加密

常见对称加密算法:

  1. DES
  2. AES

消息认证码的通信机制:

非对称加密

密钥交换/协商

这个过程是很重要的,尤其是对与对称加密算法而言。对称加密要想work,必须使得通信的双方具备同一个密钥,且不能被第三方知晓。要做到这一点,有两条路子:

  1. 提前(可能是很久之前,具备预见性)在通信的双方使用安全的方法部署好同一个密钥,供后续通信使用;
  2. 通信前使用安全的方法确定密钥(密钥交换/协商)。

第一种方式显然不太科学,缺乏灵活性和预见性。第二种方式有个依赖:如何才能安全地交换密钥信息呢?

基于加密通道传输密钥

这种就是使用非对称加密算法,发送方使用接收方公钥加密密钥(这是用于后续通信的密钥),然后直接发给接收方,接收方使用私钥解密,这样双方都有了同一个密钥。

基于通信双方共享的密钥

比如PSK算法,双方预先部署若干个共享的密钥,通过密钥编号(明文传输)协商使用哪个密钥。这是一种比较朴素的加密通信,相当少双方持有同一个密码本,然后发送“密文”(密钥编号),双方查询密码本确定明文(后续通信要用的密钥)。其实密钥编号可被中间人获取,但他不知道编号的意义。

see also DH 算法。

  1. https://www.peterjxl.com/JavaSE/encrypt-dh/
  2. https://blog.51cto.com/u_13291771/2798365