对称加密与非对称加密:算法原理、密钥交换、混合加密体系

这一章我们聊聊加密的核心——对称加密和非对称加密。说实话,这两个概念你早晚都得彻底搞明白,因为整个TLS握手、双向认证的底层全是它们。我当年刚接触密码学时,觉得对称加密简单得不行,直到第一个项目里密钥分发搞砸了才意识到……嗯,这事没那么简单。

对称加密:快,但有个死穴

对称加密,说白了就是加密和解密用同一把钥匙。你拿这把锁锁上箱子,对方拿同一把钥匙打开。速度快得离谱,适合加密大量数据。

主流算法:

  • AES(Advanced Encryption Standard):当前最通用的对称加密算法。密钥长度128/192/256位。我在生产环境里几乎只用AES-256-GCM,既能加密又能校验完整性。
  • ChaCha20:Google在移动端推崇的流密码,软件实现性能比AES还快。我记得有一次做IoT设备优化,AES的硬件加速用不了,换ChaCha20后吞吐量直接翻倍。

致命问题:密钥分发。你怎么安全地把这把钥匙交给对方?如果通过网络传,那传输过程本身就是明文的,等于白锁。这就是非对称加密要解决的。

我的小习惯:对称加密的密钥一定不能硬编码在代码里。曾经有个安全审计项目,发现开发把AES密钥写死在配置文件里,还在Git里公开……这比不加密还危险。

非对称加密:公钥私钥双保险

非对称加密用一对密钥:公钥公开,私钥自己藏好。公钥加密的数据只有对应私钥能解,反过来私钥签名、公钥验签也能做。速度比对称加密慢两三个数量级,所以我们一般只用它来做密钥交换或数字签名。

三大核心算法:

RSA

最经典的公钥算法,基于大整数因数分解的数学难题。密钥长度至少2048位,很多法规现在还要求3072位。不过RSA有个坑——它不能直接加密长数据。我刚开始用的时候,拿RSA加密整个文件,结果直接报错。后来才明白,RSA一次能加密的数据块长度取决于密钥长度,超过就得分段或只用来加密对称密钥。

Diffie-Hellman(DH)

这个算法特别有意思:双方在完全不安全的信道上,通过交换一些中间值,最终算出同一个秘密数字。任何第三方就算截获了所有通信内容,也算不出这个秘密。我最早看DH协议时觉得像变魔术,直到亲手跑了一遍示例代码才理解原理。

但传统DH不具备身份认证能力,容易遭受中间人攻击。所以我建议你只用DH配合数字签名使用,或者直接上ECDH。

ECDH(椭圆曲线 Diffie-Hellman)

用椭圆曲线代数结构替代素数域上的指数运算,同样安全强度下密钥更短(256位ECDH ≈ 3072位RSA),性能更好。现在TLS 1.3默认就使用ECDHE(临时密钥的ECDH)。

避坑指南:我曾经在生产环境里遇到过RSA密钥对和DH参数混用的错误。有人直接把RSA公钥当成DH公钥去交换,结果双方算出的共享密钥完全不一样。记住——RSA和DH是两套不同的数学机制,不能混用!

混合加密体系:取长补短

真实世界没人只用非对称加密来加密大块数据,太慢了。我们采用混合加密:

  1. 客户端生成一个随机的对称密钥(比如256位的AES密钥)。
  2. 用服务器的公钥(RSA或ECDH)加密这个对称密钥,然后发给服务器。
  3. 服务器用私钥解密,拿到对称密钥。
  4. 之后双方用这个对称密钥进行快速的对称加密通信。

这就是TLS握手中标准的密钥交换流程。我画了一张图帮你理清思路:

混合加密体系流程图 客户端 服务器 生成随机对称密钥 (AES-256) 用服务器公钥加密 (RSA / ECDH) 用私钥解密 得到对称密钥 后续通信:使用对称加密 (AES-GCM) 非对称加密只用于传输一次对称密钥,后续大数据量通信全走对称加密

对称 vs 非对称:一张表看清

特性 对称加密 非对称加密
密钥数量 双方共用一个密钥 公钥+私钥对
速度 极快(硬件加速可达几十Gbps) 慢(RSA 4096位签名约每秒几百次)
典型算法 AES, ChaCha20 RSA, DH, ECDH, ECDSA
主要问题 密钥分发困难 性能差,不能加密大块数据
TLS中用途 加密传输的应用数据 密钥交换、身份认证
重要提醒:千万别为了省事直接用非对称加密传输整条HTTP响应。我曾经见过一个项目,用RSA加密1MB的JSON数据,结果耗时3秒才完成加密,客户端解密又花了5秒——直接导致接口超时。正确的做法永远是混合加密。

总结上面这些:对称加密是“快而隐匿”,非对称加密是“慢而公开”。混合加密把两者焊接在一起,组成TLS的骨架。你记不记得我开头说密钥分发搞砸的那个项目?当时我就是只顾着用对称加密,却没解决怎么安全传递密钥的问题。后来换成混合加密,用服务器公钥加密对称密钥再传过去,问题就彻底解决了。

嗯,概念部分就这些。下一部分我们会具体看看TLS握手消息里每一步是如何使用这些算法的,不过先把这个基础打牢。记住混合加密的流程——它是整个安全的根基。