<!-- title: 空口安全激活：加密与完整性保护 -->

# 空口安全激活：加密与完整性保护的双保险原理

前几轮我们讲过5G的密钥层级与鉴权流程——手机和网络如何通过SIM卡里的根密钥“验明正身”。但鉴权成功只是拿到了“入场券”，真正让整个空口进入安全状态，还差关键一步：**安全激活**。这一步决定了从哪个字节开始加密、用哪种算法、信令和数据分别怎么保护。它是无数工程师抓包时“看到一半密文”的根源，也是理解5G安全设计哲学的最佳切入点。

## 一、从一个寄快递的类比说起

假设你要寄一份重要合同：

- **加密**相当于把合同放进一个不透明的保险箱。路上没人能看到内容——这解决的是“**防偷看**”。
- 但保险箱有个漏洞：如果有人在路上把箱子撬开，把合同里"100万"改成"10万"再封回去，收件人打开箱子看到的还是一封“完整的”合同。内容被改了，你却毫无察觉。

所以要再加一道防线：在合同上盖一个**只有你和收件人能做出的火漆印章**。收件人验一下印章——对不上，哪怕内容只有一个标点被改过，也立刻拒收。这解决的是“**防调包**”，术语叫**完整性保护**。

5G空口的安全，正是由这一对“组合拳”构成：

| 安全服务 | 通俗目标 | 技术手段 | 防御的攻击 |
|---|---|---|---|
| 机密性保护（加密） | 防偷看 | 序列密码/分组密码生成密钥流，与数据异或 | 空口窃听、 imei/imsi嗅探 |
| 完整性保护 | 防调包 | 消息认证码（MAC） | 中间人篡改、比特翻转、重放 |

**一个反直觉的事实**：只有加密、没有完整性保护的通信，是可以被“定向篡改”的。下面解释为什么。

## 二、为什么加密防不住篡改？

5G空口的主流加密模式（如AES-CTR、SNOW 3G、ZUC）本质上都是**流密码**：用密钥生成一串和明文等长的密钥流，然后做异或：

$$C = P \oplus KS$$

其中 $C$ 是密文，$P$ 是明文，$KS$ 是密钥流。解密则是 $P = C \oplus KS$。

这个设计速度极快、适合硬件实现，但有一个数学上无法回避的性质——**异或是可交换且“可定向操控”的**。攻击者虽然不知道 $KS$，但如果他**猜到**密文某一段对应的明文（比如某个协议头部的固定字段），他可以把密文的对应比特翻转：

$$C' = C \oplus \Delta \implies P' = C' \oplus KS = P \oplus \Delta$$

也就是说，攻击者不认识密钥，却能**精确地把明文中的某几位改成他想要的样子**。比如把一条控制信令里的频率点、目标地址改成另一个值。密文解出来完全“合法”，接收端毫无异常。

这就是完整性保护必须独立存在的原因：**加密让你看不懂，完整性保护让你改不了**。二者缺一不可。

## 三、完整性保护的数学原理：MAC-I

完整性保护的核心是**消息认证码**（MAC）。发送端用一个只收发双方知道的密钥，对消息本身计算出一个短的“指纹”，附在消息后面：

$$\text{MAC-I} = \text{EIA}\big(K_{int},\ COUNT,\ BEARER,\ DIR,\ \text{Message}\big) \bmod 2^{32}$$

几个输入各有深意：

- **$K_{int}$**：完整性密钥，由根密钥逐级派生，和加密密钥**分离**——即使加密密钥出问题，完整性体系不被连坐。
- **COUNT**：计数器，让每条消息的“指纹”都不同。这是**防重放**的关键：攻击者把昨天的合法信令原样重发，COUNT对不上当前窗口，直接丢弃。COUNT就像快递单上的流水号，签收过一次的号段不会再次生效。
- **BEARER**：承载标识，让不同无线承载共用一套算法但互不干扰。
- **DIR**：方向位（上行/下行），防止反向信令被“借道”伪造。

接收端用**完全相同的输入**重新计算一遍，得到 $XMAC$（期望值），与收到的 MAC-I 对比：

```mermaid
flowchart TD
    A["发送端：构造消息"] --> B["用密钥与COUNT等输入计算MAC-I"]
    B --> C["消息尾部附上MAC-I并发送"]
    C --> D["接收端：收到消息与MAC-I"]
    D --> E["用相同密钥与COUNT重算XMAC"]
    E --> F{"MAC-I 与 XMAC 一致吗"}
    F -->|一致| G{"COUNT 在有效窗口内吗"}
    G -->|在窗口内| H["接受消息 递交给上层"]
    G -->|不在窗口| I["判为重放 丢弃"]
    F -->|不一致| J["判为被篡改 丢弃并触发安全异常"]
```

注意一个细节：**校验失败的消息会被直接丢弃，不会“降级”为不校验继续用**。安全机制没有“宽容模式”——要么完整可信，要么整体作废。这个“全有或全无”的设计原则贯穿5G安全始终。

## 四、保护的三张“地图”：NAS、RRC与用户面

5G把需要保护的流量分成三个域，每个域有独立的密钥、独立的激活开关。这是理解安全激活的钥匙：

```mermaid
flowchart TD
    UE["UE 手机"] -->|NAS信令| AMF["AMF 核心网接入与移动管理"]
    UE -->|RRC信令| gNB["gNB 基站"]
    UE -->|用户面数据| UPF["UPF 用户面功能"]

    subgraph NASP ["NAS域保护 由AMF终结"]
        N1["非接入层信令加密+完整性"]
        N2["密钥派生自K_AMF 跨基站有效"]
    end

    subgraph ASP ["AS域保护 由gNB终结"]
        A1["RRC信令加密+完整性"]
        A2["用户面数据加密必选"]
        A3["用户面数据完整性可选 5G新增"]
    end

    AMF -.->|下发密钥与算法| gNB
```

三张“地图”的差异一目了然：

| 保护对象 | 加密 | 完整性保护 | 密钥锚点 | 特点 |
|---|---|---|---|---|
| NAS信令（手机↔AMF） | 必选 | 必选 | $K_{AMF}$ 派生 | 跨基站、跨切换持续有效 |
| RRC信令（手机↔基站） | 必选 | 必选 | $K_{gNB}$ 派生 | 只在当前连接内有效 |
| 用户面数据（手机↔UPF） | 必选 | **可选（5G新增）** | $K_{gNB}$ 派生 | 由网络按会话协商开启 |

最值得注意的就是最后一行：**用户面完整性保护是5G才引入的新能力**，4G时代用户面只有加密、没有完整性保护。为什么5G要加？

因为5G的定位变了。4G主要承载“人的上网”，数据被篡改的损失可以靠上层协议（TLS等）兜底；但5G要承载**工业控制、远程驾驶、电网差动保护**——一个被篡改的“急停”指令，靠TLS是拦不住的（很多工控流量根本不走TLS）。所以在空口这一跳，网络**有能力**对每个数据包做完整性校验，就成了行业刚需。

那为什么又是“可选”而不是像信令那样强制？答案很工程化：完整性校验要逐包计算MAC，对硬件有开销。**语音这类实时业务（如5QI=1的IMS语音）对处理时延极其敏感**，逐包校验可能影响通话质量。因此标准把选择权交给运营商：按会话逐一协商是否开启。现网中，数据类会话开启较多，语音媒体流通常不启用（具体取决于运营商配置）。还有一条重要的配套规则：一旦某个承载协商了完整性保护及其**最高速率**，超出该速率的流量会被**直接释放**，而不是“悄悄退回不保护模式”——宁可断业务，不给攻击者留降级后门。

## 五、算法菜单：EEA/EIA家族

安全激活时，网络要从“菜单”里为每个域各点一道“加密菜”和一道“完整性菜”。5G的算法家族（N=New，区别于4G的EEA/EIA前缀）如下：

| 算法标识 | 加密家族 | 原语 | 说明 |
|---|---|---|---|
| NEA0 | 空算法 | — | 不加密，5G中允许使用 |
| NEA1 | SNOW 3G | 序列密码 | 4G时代的主力，欧洲团队设计 |
| NEA2 | AES | 计数器（CTR）模式 | 性能与安全性均衡的“万金油” |
| NEA3 | ZUC-256 | 序列密码 | 中国设计的祖冲之算法，由中国科学院数据与通信保护研究教育中心（DCS中心）提出，后成为国际标准 |

完整性保护家族与之对应：

| 算法标识 | 家族 | 输出 | 说明 |
|---|---|---|---|
| NIA0 | 空算法 | — | **仅限紧急呼叫**等特殊场景 |
| NIA1 | SNOW 3G | 32位MAC | |
| NIA2 | AES-CMAC | 32位MAC | 现网最常用的完整性算法 |
| NIA3 | ZUC | 32位MAC | |

两个耐人寻味的设计：

**其一，NEA0（不加密）在5G里是合法选项，NIA0（不保护完整性）却几乎被禁足。** 对照第二节的结论就能理解：不加密只损失私密性，尚有上层TLS兜底；不保护完整性则等于裸奔在篡改攻击面前。所以标准的态度是——机密性可以商量，完整性寸步不让（紧急呼叫这类“连SIM都没有”的场景除外）。

**其二，算法怎么选？** 手机在注册时上报自己支持的算法列表（UE安全能力），网络从中挑选双方都支持、且优先级最高的组合。听起来很民主，但这恰恰是历史上被攻击过的环节，下一节详述。

## 六、安全激活的全过程：两段式上岗

现在把镜头对准整个流程。5G的安全激活是**两段式**的：先激活NAS安全，再激活AS安全。顺序绝对不能颠倒。

```mermaid
sequenceDiagram
    participant UE as UE 手机
    participant gNB as gNB 基站
    participant AMF as AMF 核心网

    UE->>AMF: Registration Request 明文IE为主 但带完整性保护
    AMF->>UE: 鉴权流程 5G-AKA 生成根密钥体系
    AMF->>UE: NAS Security Mode Command 指明所选NEA与NIA
    Note over UE,AMF: 此消息本身用MAC-I做完整性保护 但未加密
    UE->>AMF: NAS Security Mode Complete 已加密已保护
    Note over UE,AMF: NAS安全上线 从此NAS信令双保护
    AMF->>gNB: Initial Context Setup 携带派生密钥与算法选择
    gNB->>UE: RRC Security Mode Command 完整性保护
    UE->>gNB: RRC Security Mode Complete 双保护
    Note over UE,gNB: AS安全上线 RRC与用户面开始加密
    gNB->>UE: 建立DRB 用户面数据流启动保护
```

**为什么必须NAS先于AS？** 这是一条严密的信任链推理：

1. AS安全的密钥是从 $K_{AMF}$ 派生出 $K_{gNB}$ 的，而派生动作的前提是NAS安全已经建立——**先有保险柜（NAS），才能往里面放钥匙（AS）**。
2. NAS安全由AMF终结，不依赖任何具体基站。手机换基站、跨省漫游，NAS安全上下文原样跟随；而AS安全每个基站各管一段。先建立“长效保险”，再补“短效保险”，切换瞬间才不会出现保护真空。
3. 初始注册请求这条消息很特殊：它主体是明文，但**已经用手机里残留的旧NAS密钥（如果存在）做了完整性保护**。这让网络能确认“这条请求真的来自声称的那台手机”，防止伪造注册，也为后续安全协商打下可信地基。
4. 涉及隐私的关键信息（如设备标识IMEI），**必须等安全激活完成后才能发送**——明文阶段一个字节都不多给。

## 七、被攻击过的环节：UE安全能力与降级攻击

第六节提到，算法是网络根据“手机上报的能力”来选的。这里藏着一个经典漏洞，也是5G相对4G改进最大的地方。

设想一个假基站（这也呼应了我们之前讲过的“伪基站防线”主题，但角度不同）：手机上报“我支持NEA1/2/3”，假基站在转发这条消息时**偷偷删掉高安全算法，只留下NEA0**，然后逼着手机用不加密模式通信。手机明明有能力，却被“降级”成了裸奔——这就是**降级攻击**。

防御思路不是发明新密码，而是**让能力上报本身进入被保护的范围**：手机的安全能力列表被纳入完整性保护的计算范围，网络侧会核对“我收到的能力”与“手机最初上报的能力”是否一致，不一致即判定中间有鬼，拒绝建立连接。此外，5G还把“最近一次成功使用的算法集”记录下来，防止会话重建时被悄悄换掉弱算法。

这类设计的哲学值得每个工程师体会：**安全体系中最脆弱的往往不是密码算法本身，而是“协商过程”这种看起来平平无奇的握手环节**。算法再强，选算法的过程被人做了手脚，全盘皆输。

## 八、现网实战：工程师在哪里会遇到它

**场景一：抓包看到密文 NAS，抓不下去怎么办？**
安全激活完成后，Wireshark里NAS消息显示为加密的nas-5gs，内容是一堆不可读字节。这不是抓包姿势不对，而是安全机制在正常工作。要解码，需要从测试USIM或试验网导出 $K_{NASenc}$ 与 $K_{NASint}$，在解析工具中手工灌入密钥与COUNT。做核心网联调的团队，通常会在测试环境刻意配置已知密钥。

**场景二：Initial Context Setup 失败，cause 是 Security mode reject。**
典型排查链：先查核心网与基站配置的算法集合是否有交集——比如核心网只允许NIA2，而测试USIM的算法白名单没勾选AES-CMAC，则UE会回security mode reject；再查密钥派生链路是否一致（鉴权过程中间失败重试会导致 $K_{SEAF}$ 失步）。这类问题在实验室换卡、换核心网版本联调时极为常见。

**场景三：UP完整性保护开启后，某业务建不起承载。**
先查协商的“最高完整性保护速率”是否低于业务峰值——记住规则：超速是**直接释放**而非自动降级。定位思路是把UP IP关掉做对照实验，确认问题域再查速率协商参数。

**场景四：切换后偶发掉话，日志里出现COUNT异常。**
COUNT由PDCP序号加超帧号拼接而成，速率极高的业务会让COUNT更快“绕回零点”。翻卷时必须同步更新密钥（换新密钥继续），否则计数器重复会打开重放攻击的窗口。若基站与手机对COUNT理解不一致（如切换准备时未同步HFN），就会出现校验失败、数据被安全机制“误杀”的掉话。

**三个常见误解，最后再敲一次黑板：**
- ❌ “加密了就安全了” —— 没有完整性保护的加密可被定向篡改，二者是不同维度的防线。
- ❌ “安全激活失败可以先用明文顶着” —— 不存在降级兜底，失败只能重建或释放。
- ❌ “用户面完整性保护5G强制开启” —— 它是可选能力，按会话协商，语音类业务常不启用。

## 常见问题

**Q: 加密和完整性保护的区别是什么？为什么两个都要？**
A: 加密防“偷看”——让第三方读不懂内容；完整性保护防“调包”——让第三方改不了内容。流密码加密天然存在“比特翻转”漏洞（攻击者可定向修改密文对应明文），只有加密没有MAC的通信，等于把一份“看得见改得着”的合同交了出去。5G中信令加密与完整性保护都强制，用户面加密强制、完整性按需协商。

**Q: NIA0是什么？既然存在，是不是可以不用完整性保护？**
A: NIA0是“空完整性算法”（什么都不算），但它被严格限制在紧急呼叫等无鉴权场景。普通业务禁用的原因正是本文核心：无完整性保护等于对篡改攻击裸奔。安全设计上“机密性可协商、完整性不让步”是刻意的取舍。

**Q: 为什么安全激活后Wireshark抓的NAS是密文？怎样才能看到内容？**
A: 因为NAS安全模式完成后所有NAS消息都加密了，这是安全机制生效的正常表现。要解码需拿到测试环境导出的NAS加密/完整性密钥和COUNT值，手工灌入解析工具。商用网络中这些密钥永不出核心网安全域，抓包天然不可读。

**Q: 用户面完整性保护为什么4G没有、5G有了又是可选的？**
A: 4G面向人上网，防篡改靠上层TLS兜底即可；5G面向工业控制等关键流量，必须有空口级完整性能力，因此引入。设为可选是因为逐包算MAC有硬件开销，对语音等低时延业务可能伤及体验，于是把开关交给运营商按会话决策，并用“超速即释放”的规则堵住降级后门。

**Q: 安全模式命令（SMC）失败后手机会怎样？**
A: 不存在“回退明文”的选项。NAS SMC失败则注册流程终止重来；AS SMC失败则连接释放。这是“全有或全无”原则的体现——宁可业务中断，不给攻击者制造降级窗口。

## 参考来源


---
> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**（微信ID: gprshome201101）维护，聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。
> 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
