一、对称加密的工作原理
对称加密是加密、解密使用同一密钥 的加密方式,核心特点是速度快、适合大流量数据,但存在 "密钥安全分发" 的难题。
1. 基础对称加密:XOR(异或)加密
XOR 是最简单的对称加密,基于 "按位异或" 运算(规则:0⊕0=0,1⊕1=0,0⊕1=1,1⊕0=1):
- 加密过程:明文(二进制)与密钥(二进制)逐位异或,得到密文。
- 解密过程:密文与同一密钥逐位异或,还原明文。
- 示例:明文:
1010(对应十进制 10)密钥:0110(对应十进制 6)加密:1010 ⊕ 0110 = 1100(密文)解密:1100 ⊕ 0110 = 1010(还原明文) - 缺点:安全性极低(密钥长度等于明文时才相对安全,但实际无法实现),仅用于理解对称加密逻辑,无工业应用。
2. 工业级对称加密:AES 算法
AES(Advanced Encryption Standard,高级加密标准)是目前全球通用的对称加密算法,支持 128/192/256 位密钥长度(密钥越长,安全性越高),属于分组密码(将明文分成固定长度的 "分组",逐组加密)。
AES 的核心流程(以 128 位密钥为例):
AES 的加密过程包含1 轮初始轮密钥加 + 9 轮主轮函数 + 1 轮最终轮函数,每轮操作由 4 个步骤组成:
- 字节代换(SubBytes):通过 S 盒(预定义的置换表)将每个字节替换为另一个字节,实现非线性混淆。
- 行移位(ShiftRows):将数据块的行进行循环移位(第 1 行不移,第 2 行移 1 位,第 3 行移 2 位,第 4 行移 3 位),实现扩散。
- 列混合(MixColumns):将数据块的列按线性变换混合,进一步扩散数据。
- 轮密钥加(AddRoundKey):将当前数据块与轮密钥(由原始密钥生成)逐位异或,注入密钥信息。
AES 的工作模式(解决分组拼接安全问题):
- ECB(电子密码本):每个分组独立加密,相同明文分组会得到相同密文,易被破解(不推荐)。
- CBC(密码分组链接):前一个密文分组与当前明文分组异或后再加密,需初始化向量(IV),安全性较高,但不支持并行加密。
- GCM(伽罗瓦 / 计数器模式):同时提供加密和消息认证(MAC),支持并行加密 / 解密,是 TLS1.2 + 的主流选择。
二、非对称加密的工作原理
非对称加密(公钥加密)使用一对密钥(公钥 + 私钥):公钥公开,用于加密 / 验签;私钥保密,用于解密 / 签名。核心解决 "对称密钥的安全分发" 问题,但速度远慢于对称加密。
1. RSA 算法(基于大数分解难题)
RSA 是最经典的非对称加密算法,安全性基于 "大整数分解为两个素数的计算难度"。
RSA 的密钥生成流程:
- 选素数 :随机选择两个大素数
p和q(实际需数百位)。 - 算模数 :计算
n = p × q(公钥和私钥的公共模数)。 - 欧拉函数 :计算
φ(n) = (p-1) × (q-1)(表示 1~n 中与 n 互质的数的数量)。 - 选公钥 :选整数
e,满足1 < e < φ(n)且e与φ(n)互质(常用e=65537)。 - 算私钥 :计算
d,满足(e × d) mod φ(n) = 1(d是e的模逆元)。
- 最终:公钥为
(e, n),私钥为(d, n)。
RSA 的加密 / 解密流程:
- 加密 (公钥加密):明文
M(需M < n)→ 密文C = M^e mod n。 - 解密 (私钥解密):密文
C→ 明文M = C^d mod n。
示例(简化版,实际用大素数):
- 选
p=3,q=5→n=15,φ(n)=8。 - 选
e=3(与 8 互质)→ 算d=3(因为3×3=9 mod 8=1)。 - 公钥
(3,15),私钥(3,15)。 - 加密明文
M=2→C=2^3 mod15=8。 - 解密密文
C=8→M=8^3 mod15=512 mod15=2。
2. OpenSSL 实战验证 RSA
OpenSSL 是开源加密工具库,可快速实现 RSA 的密钥生成、加密、解密、签名、验签:
步骤 1:生成 RSA 密钥对(2048 位)
bash
# 生成私钥(PEM格式,加密存储,需输入密码)
openssl genrsa -aes256 -out rsa_private.key 2048
# 从私钥中提取公钥
openssl rsa -in rsa_private.key -pubout -out rsa_public.pem
步骤 2:RSA 加密 / 解密文件
bash
# 用公钥加密明文文件plain.txt
openssl pkeyutl -encrypt -in plain.txt -inkey rsa_public.pem -pubin -out cipher.bin
# 用私钥解密密文文件cipher.bin
openssl pkeyutl -decrypt -in cipher.bin -inkey rsa_private.key -out plain_decrypted.txt
步骤 3:RSA 签名 / 验签
bash
# 用私钥对文件plain.txt签名(SHA256哈希)
openssl dgst -sha256 -sign rsa_private.key -out sign.sha256 plain.txt
# 用公钥验证签名
openssl dgst -sha256 -verify rsa_public.pem -signature sign.sha256 plain.txt
# 验证成功会输出:Verified OK
3. 非对称加密应用:PKI 证书体系
PKI(Public Key Infrastructure,公钥基础设施)是解决 "公钥信任" 的体系,核心是CA(证书颁发机构):
PKI 的核心组件:
- CA:可信第三方,负责签发 / 吊销证书,拥有自己的根密钥对。
- 数字证书:包含 "用户公钥 + 用户身份信息 + CA 签名" 的文件,证明 "公钥属于该用户"。
- 证书链:根 CA 签发中间 CA 证书,中间 CA 签发终端用户证书,形成信任链(终端用户只需信任根 CA)。
证书验证流程:
- 客户端获取服务器证书,验证CA 签名(用 CA 公钥解密签名,对比证书哈希值)。
- 验证证书有效期 和吊销状态(通过 CRL 或 OCSP 查询)。
- 确认证书绑定的域名与服务器一致。
4. 非对称加密应用:DH 密钥交换
DH(Diffie-Hellman)是一种密钥协商协议,允许双方在不安全信道上协商出共享对称密钥,核心是 "离散对数难题"。
DH 密钥协商流程:
- 双方公开约定:大素数
p、生成元g(g是p的原根)。 - Alice :选私钥
a→ 算公钥A = g^a mod p,发送A给 Bob。 - Bob :选私钥
b→ 算公钥B = g^b mod p,发送B给 Alice。 - 共享密钥计算 :
- Alice:
K = B^a mod p - Bob:
K = A^b mod p(因B^a = (g^b)^a = g^(ab) = (g^a)^b = A^b,故双方得到相同的K)
- Alice:
缺点:无身份认证,易受 "中间人攻击"(TLS 中通常用 "认证 DH",如 ECDHE + 证书)。
三、ECC 椭圆曲线的特性与 DH 升级
ECC(Elliptic Curve Cryptography,椭圆曲线密码学)是基于 "椭圆曲线离散对数难题" 的非对称加密技术,核心优势是相同安全强度下,密钥更短、运算更快(256 位 ECC≈3072 位 RSA)。
1. ECC 的核心数学基础
ECC 基于有限域上的椭圆曲线方程 :y² = x³ + ax + b(a,b是有限域中的常数)。
- 点运算 :
- 点加(P+Q):过 P、Q 两点的直线与曲线的第三个交点,关于 x 轴的对称点。
- 点乘(kP):
kP = P+P+...+P(k 次点加,k 是私钥,P 是基点)。
- 椭圆曲线离散对数难题 :已知基点
P和点Q=kP,求私钥k的计算难度极大(远高于 RSA 的大数分解)。
2. DH 协议升级:基于椭圆曲线的 ECDH
ECDH 是 DH 的椭圆曲线版本,用 "点乘" 代替 DH 的 "模幂运算",流程更高效:
ECDH 密钥协商流程:
- 双方公开约定:椭圆曲线参数(如 secp256r1)、基点
G。 - Alice :选私钥
a→ 算公钥A = aG,发送A给 Bob。 - Bob :选私钥
b→ 算公钥B = bG,发送B给 Alice。 - 共享密钥计算 :
- Alice:
K = aB = a(bG) = abG - Bob:
K = bA = b(aG) = abG(双方得到相同的共享密钥K)
- Alice:
ECDH 是 TLS1.2 + 的主流密钥交换算法(如 ECDHE,带 "临时" 属性,支持前向安全)。
四、TLS 协议的工作原理
TLS(Transport Layer Security,传输层安全)是运行在 TCP 之上的安全协议,为应用层(如 HTTP)提供机密性(加密)、完整性(MAC)、身份认证(证书)。
TLS 的协议分层:
- 记录层:将应用数据分块,进行加密、MAC 计算,封装为 TLS 记录。
- 握手层:协商加密套件、认证身份、生成会话密钥(核心层)。
- 警报层:传递错误信息(如证书无效、加密失败)。
- 应用数据层:承载 HTTP 等应用层数据。
TLS1.2 的完整握手流程(以 ECDHE 加密套件为例):
- 客户端 Hello :
- 客户端发送:支持的 TLS 版本(如 TLS1.2)、加密套件列表(如 ECDHE-RSA-AES256-GCM-SHA384)、客户端随机数
R1、支持的椭圆曲线参数。
- 客户端发送:支持的 TLS 版本(如 TLS1.2)、加密套件列表(如 ECDHE-RSA-AES256-GCM-SHA384)、客户端随机数
- 服务器 Hello :
- 服务器回复:选定的 TLS 版本、加密套件、服务器随机数
R2、选定的椭圆曲线参数。
- 服务器回复:选定的 TLS 版本、加密套件、服务器随机数
- 服务器证书 :
- 服务器发送数字证书(包含服务器公钥),证明身份。
- 服务器密钥交换 :
- 服务器生成 ECDH 临时私钥
b→ 算临时公钥B = bG,发送B(含签名,防止篡改)。
- 服务器生成 ECDH 临时私钥
- 服务器 Hello Done:服务器通知握手请求阶段结束。
- 客户端密钥交换 :
- 客户端生成 ECDH 临时私钥
a→ 算临时公钥A = aG,发送A; - 客户端计算预主密钥
K_pre = aB(ECDH 共享密钥); - 用
R1+R2+K_pre生成会话密钥(对称密钥,用于后续加密)。
- 客户端生成 ECDH 临时私钥
- 客户端 Finished :
- 客户端用会话密钥加密 "Finished 消息"(包含之前握手消息的哈希),发送给服务器(验证密钥有效性)。
- 服务器 Finished :
- 服务器用会话密钥加密 "Finished 消息",发送给客户端(验证密钥有效性)。
握手完成后,双方用会话密钥加密应用数据。
五、TLS1.2 与 TLS1 的对比
TLS1 是早期版本(2000 年发布),TLS1.2(2008 年发布)是目前的主流安全版本,核心改进如下:
| 对比项 | TLS1 | TLS1.2 |
|---|---|---|
| 加密套件 | 仅支持 DES、3DES 等弱算法 | 支持 AES-GCM、ChaCha20 等强算法 |
| 哈希算法 | 仅支持 MD5、SHA-1(已被破解) | 支持 SHA-256、SHA-384 等安全哈希 |
| 密钥交换 | 仅支持 RSA(无后向安全) | 支持 ECDHE、DHE(带后向安全,即使私钥泄露,历史数据仍安全) |
| 扩展性 | 几乎无扩展字段 | 支持扩展字段(如 ALPN、SNI) |
六、TLS 握手的优化
TLS 握手默认需要 2~3 个 RTT(往返时间),通过以下优化可减少延迟:
1. Session 缓存(会话复用)
- Session ID :服务器缓存会话密钥,客户端下次握手时发送
Session ID,服务器直接复用密钥(无需重新协商),握手仅需 1 个 RTT。 - Session Ticket:服务器将会话密钥加密为 "Ticket" 发送给客户端,客户端下次握手时携带 Ticket,服务器解密后复用密钥(无需服务器缓存)。
2. False Start(假启动)
客户端在发送Finished消息后,直接发送应用数据(无需等待服务器的Finished消息),减少 1 个 RTT。
3. 0-RTT(TLS1.3 特性)
客户端复用之前的会话密钥,在首次请求时直接发送加密的应用数据,实现 "0 往返" 握手(但存在重放攻击风险,需业务层防护)。
七、TLS 与量子通讯的原理
量子计算机的 "肖尔算法" 可快速破解 RSA、ECC 等传统加密算法,因此需要量子安全的加密方案,主要包括 "量子密钥分发(QKD)" 和 "后量子加密算法"。
量子通讯 BB84 协议的执行流程
BB84 是最经典的 QKD 协议,利用量子的 "叠加态" 和 "不可克隆定理",在不安全信道上生成安全的共享密钥(可用于 TLS 的会话密钥):
-
Alice 生成量子比特:
- 选两组基:Z 基(测量结果为
|0>或|1>)、X 基(测量结果为|+>或|->); - 随机生成明文密钥(如
0101),随机选基对每个比特编码:- 若比特是
0,选 Z 基则编码为|0>,选 X 基则编码为|+>; - 若比特是
1,选 Z 基则编码为|1>,选 X 基则编码为|->;
- 若比特是
- 将编码后的量子比特(如光子)发送给 Bob。
- 选两组基:Z 基(测量结果为
-
Bob 测量量子比特:
- Bob 随机选基(Z 或 X)测量每个量子比特,记录测量结果。
-
基比对(经典信道):
- Alice 和 Bob 公开各自的选基信息,保留 "基相同" 的比特(基不同的比特丢弃),得到 "原始密钥"。
-
纠错与隐私放大:
- 双方通过经典信道验证原始密钥的误码率,纠正错误;
- 对纠错后的密钥进行 "隐私放大"(缩短密钥长度,消除窃听者可能获取的信息),得到最终共享密钥。
该密钥可用于 TLS 的会话密钥,实现 "量子安全" 的加密通信。
我们用 "彩色卡片 + 正反面" 的生活场景,把 BB84 协议简化成 "Alice 和 Bob 偷偷生成共享密码,同时防 Eve 偷听" 的过程:
先定义 "量子工具" 的生活类比
- 基(Z 基 / X 基):类比成 "卡片颜色"------ 红色卡片 = Z 基,蓝色卡片 = X 基(不同颜色代表不同的 "观察规则")。
- 比特(0/1) :类比成 "卡片正反面"------
- 用 ** 红色卡片(Z 基)** 时:正面 = 0,反面 = 1;
- 用 ** 蓝色卡片(X 基)** 时:正面 = 0,反面 = 1;
- 量子比特(光子):就是 "写了比特的彩色卡片"------ 比如 "红色正面卡"=Z 基的 0,"蓝色反面卡"=X 基的 1。
- 不可克隆定理:Eve(窃听者)没法 "偷偷复制卡片",只要她碰了卡片,卡片的颜色 / 正反面会被改变。
BB84 协议简化流程(生成 2 位共享密码)
步骤 1:Alice 写卡片(生成量子比特)
Alice 要生成2 位密码,她做了 2 件事:
- 随机选 2 个比特(比如想生成的密码是
0、1);- 给每个比特随机选 "卡片颜色(基)",写好正反面:
- 第 1 位比特
0:选红色卡片(Z 基),写 "正面"(对应 Z 基的 0);- 第 2 位比特
1:选蓝色卡片(X 基),写 "反面"(对应 X 基的 1)。然后 Alice 把这 2 张卡片(红色正面、蓝色反面)偷偷传给 Bob。
步骤 2:Bob 看卡片(测量量子比特)
Bob 不知道 Alice 用了什么颜色的卡片,他只能 ** 随机选颜色(基)** 看卡片:
- 看第 1 张卡片:Bob 选了红色(Z 基) ,看到是 "正面",记为
0;- 看第 2 张卡片:Bob 选了红色(Z 基) ,但这张实际是蓝色卡片(X 基)------ 按红色规则看蓝色卡片,结果会 "不准",他看到是 "反面",记为
1。步骤 3:基比对(公开说颜色,不说正反面)
Alice 和 Bob 在 "公开聊天(经典信道)" 里只说卡片颜色(基),不说正反面(比特):
- Alice 说:"第 1 张我用的红色,第 2 张蓝色";
- Bob 说:"第 1 张我用的红色,第 2 张红色"。
他们保留颜色相同的卡片(因为颜色不同时,Bob 的结果肯定不准):
- 第 1 张:Alice 和 Bob 都用了红色→保留;
- 第 2 张:Alice 蓝色、Bob 红色→丢弃。
此时他们的原始密码 就是第 1 张的比特:
0。步骤 4:纠错(确保结果一致)
如果他们多传几张卡片,比如传了 3 张,可能出现 "颜色相同但正反面记的不一样" 的情况(比如 Alice 记的是正面,Bob 记成反面)------ 这时候他们会在公开聊天里 "核对部分结果",把错误的比特改掉(比如发现第 3 张颜色相同但结果不同,改成一致的)。
步骤 5:隐私放大(防 Eve 偷看)
假设 Eve 偷偷碰了第 2 张卡片(蓝色反面):
- Eve 选红色卡片看,会把 "蓝色反面卡" 改成 "红色某面卡";
- 等 Bob 用红色看这张卡时,结果会和 Alice 的原始比特完全无关;
- Alice 和 Bob 基比对时,发现 "颜色相同但结果对不上",就知道 "被偷听了",会废掉这次密码,重新生成。
如果没被偷听,他们会把原始密码缩短一点 (比如原始密码是
010,缩短成01)------ 去掉可能被 Eve 偷偷获取的信息,得到最终的共享密码 (比如0)。最终效果
Alice 和 Bob 拿到了相同的共享密码(比如
0),这个密码可以用来当 TLS 的会话密钥 ------ 而且 Eve 要么没偷听到,要么一偷听就会被发现,完美实现 "量子安全" 的密钥共享。