Skip to main content

23 对称加密与非对称加密

对称加密

加密和解密时使用的密钥都是同一个,是对称的。只要保证了密钥的安全,那整个通信过程就可以说具有了机密性。

TLS 里可用的对称加密算法:RC4、DES、3DES、AES、ChaCha20 等,前三种算法都被认为是不安全的,通常都禁止使用,目前常用的只有 AES 和 ChaCha20。

  • AES 高级加密标准(Advanced Encryption Standard),密钥长度可以是 128、192 或 256。安全强度很高,性能也很好,而且有的硬件还会做特殊优化,是应用最广泛的对称加密算法。
  • ChaCha20 是 Google 设计的一种加密算法,密钥长度固定为 256 位,纯软件运行性能要超过 AES,曾经在移动客户端上比较流行,但 ARMv8 之后也加入了 AES 硬件优化,现在不再具有明显的优势。

非对称加密

有两个密钥,一个叫公钥(public key),一个叫私钥(private key)。两个密钥是不同的,公钥可以公开给任何人使用,而私钥必须严格保密。

公钥和私钥有个特别的单向性,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。

在 TLS 里有 DH、DSA、RSA、ECC 等加密算法。

  • RSA 的安全性基于整数分解的数学难题,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推算出私钥非常困难。
  • ECC(Elliptic Curve Cryptography)基于椭圆曲线离散对数的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名。

混合加密

非对称加密都是基于复杂的数学难题,运算速度很慢,把对称加密和非对称加密结合起来呢,两者互相取长补短,即能高效地加密解密,又能安全地密钥交换。

  1. 在通信刚开始的时候使用非对称算法,比如 RSA、ECDHE,首先解决密钥交换的问题。
  2. 然后用随机数产生对称算法使用的会话密钥(session key),再用公钥加密。因为会话密钥很短,通常只有 16 字节或 32 字节,所以慢一点也无所谓。
  3. 对方拿到密文后用私钥解密,取出会话密钥,双方就实现了对称密钥的安全交换,后续就不再使用非对称加密,全都使用对称加密。