首页 › security › 5G密钥层级与切换密钥推导机制深度解读

5G密钥层级与切换密钥推导机制深度解读:TS 33.501 Section 6与Annex A的完整推演

一、为什么5G必须重新设计密钥架构

要理解5G的密钥层级,必须先理解4G时代遗留的结构性缺陷。EPS(4G)的密钥体系以K_eNB为核心:MME从K_ASME推导出K_eNB下发给基站,切换时通过"Next Hop(NH)"参数做密钥链式更新。这套设计有两个广受批评的问题:

  1. 密钥输入单调性不足:4G中K_eNB的推导输入主要依赖NAS COUNT和切换参数,同一锚点反复推导时新鲜度输入有限,一旦某个中间密钥泄露,推导出的下级密钥可预测性偏高。
  2. 锚点密钥与接入侧强耦合:K_ASME直接进入基站侧密钥推导链,认证域(AUSF/UDM所在网络)与接入域(SEAF/AMF所在网络)之间没有明确的密钥信任分层,漫游场景下归属网络对最终空口密钥的“可追溯性”较弱。

3GPP在TS 33.501《Security architecture and procedures for 5G System》第6章中给出的答案是:一个七级密钥派生树 + 全程绑定身份/算法/计数器的KDF输入设计 + NH/NCC双轨密钥更新机制。本文聚焦其中最核心的三段机制:锚点密钥推导(K_AUSF→K_SEAF→K_AMF)、接入密钥分裂(K_gNB与K_NAS系列)、以及切换时最容易被误解的水平/垂直密钥推导(Section 6.9)。


二、密钥层级全景:从永久密钥K到用户面加密密钥

TS 33.501 Figure 6.1.1-1定义了完整的密钥层级。用一张图梳理每级密钥的锚点、存放位置与用途:

flowchart TB
    K["K(USIM与UDM/ARPF共享的永久根密钥)"]
    CKIK["CK / IK(AKA认证向量输出)"]
    KAUSF["K_AUSF<br/>锚定认证结果 · 存于AUSF"]
    KSEAF["K_SEAF<br/>锚定服务网络 · 存于SEAF(与AMF合设)"]
    KAMF["K_AMF<br/>锚定UE-AMF安全上下文 · 存于AMF与UE"]
    KGNB["K_gNB<br/>基站级密钥 · AMF下发"]
    KRR["K_RRC_int / K_RRC_enc<br/>RRC完整性/加密"]
    KUP["K_UPint / K_UPenc<br/>用户面完整性/加密"]
    KNAS["K_NAS_int / K_NAS_enc<br/>NAS层完整性/加密"]

    K -->|"AKA运行(5G-AKA或EAP-AKA')"| CKIK
    CKIK -->|"KDF(FC=0x6A, '5G-AKA')<br/>或 EAP-AKA'的EMSK"| KAUSF
    KAUSF -->|"KDF(FC=0x6C, SUPI)"| KSEAF
    KSEAF -->|"KDF(FC=0x6D, SUPI/SUCI, ABBA)"| KAMF
    KAMF -->|"KDF(FC=0x69, 算法标识)"| KNAS
    KAMF -->|"垂直: KDF(FC=0x6E, UL NAS COUNT)<br/>水平: K_gNB = KDF(K_gNB旧, PCI, NCC)"| KGNB
    KGNB --> KRR
    KGNB --> KUP

这张树有几个关键设计约束,每一条都对应一个具体的安全目标:

设计约束 具体体现 安全目标
逐级单向派生 上级密钥推导下级密钥后可删除上级 中间人攻破一级不殃及上级域
身份绑定 K_AMF推导输入含SUPI(或SUCI) 密钥不可跨用户移植
网络绑定 K_SEAF推导输入含服务网络标识(SN ID) 防跨网络重放(EAP-AKA'的本质改进)
算法绑定 K_NAS/K_RRC推导输入含算法标识(NIA/NEA编号) 算法协商结果进入密钥,防降级
计数器绑定 K_gNB垂直推导输入含Uplink NAS COUNT 同一安全上下文内永不重用相同密钥输入

三、逐级KDF输入解析:Annex A的参数明细

5G所有密钥推导共用TS 33.203附录定义、并在TS 33.501 Annex A中实例化的同一套KDF:本质是HMAC-SHA-256,输入为 KDF(锚点密钥, FC, P0, L0, P1, L1, ...),其中FC(Function Characteristic)是1字节的功能区分码,P是变长参数。各段推导的输入参数如下表(FC取值以TS 33.501 Annex A现行版本为准,此处为Rel-17及以后各版本通行的分配):

密钥 锚点密钥 FC P0 / P1(关键输入) 推导位置
K_AUSF(5G-AKA) CK ‖ IK 0x6A P0 = "5G-AKA"(6字节ASCII) AUSF、UE
K_AUSF(EAP-AKA') EMSK — 直接取EAP-AKA'主会话密钥EMSK,无需KDF AUSF、UE
K_SEAF K_AUSF 0x6C P0 = SUPI AUSF→SEAF传递
K_AMF K_SEAF 0x6D P0 = SUPI或SUCI,P1 = ABBA(2字节) SEAF、UE
K_NAS_int / K_NAS_enc K_AMF 0x69 P0 = 算法标识(NIA1/NIA2/NIA3或NEA0~NEA3的4字节编码),P1 = 密钥用途区分 AMF、UE
K_gNB(垂直,初始/AMF内迁移) K_AMF 0x6E P0 = Uplink NAS COUNT AMF、UE
NH(首次) K_AMF 0x6F P0 = K_AMF派生输入 AMF
NH(后续) K_AMF 0x6F P0 = 上一次NH AMF
K_gNB*(水平推导中间值) K_gNB(旧) — P0 = PCI,P1 = 目标NCC gNB、UE
K_RRC_int / K_RRC_enc K_gNB 0x70 P0 = 算法标识 gNB、UE
K_UPint / K_UPenc K_gNB 0x71 P0 = 算法标识,P1 = UP安全策略区分 gNB、UE

为什么必须逐级携带这么多参数? 这是5G相对4G最本质的改进——每一级推导都把“这条密钥为谁、在哪、用什么算法、第几次使用”写进了HMAC输入。任何一项变化都会产生完全不同的密钥,因此攻击者无法把一个网络里截获的密钥材料搬到另一个上下文中使用(这是形式化分析结论,Basin等人在CCS 2018对5G-AKA的符号化验证支持这类不可链接性结论)。

ABBA参数:两个字节的算法防降级锁

K_AMF推导中的ABBA参数是初学者最容易忽略却最能体现设计功力的IE。它长2字节:第一字节是NAS下行/上行安全算法集的编码,第二字节是其按位取反(例如0x02 0xFD表示NEA2/NIA2这套算法组合)。取反校验的目的是让AMF和UE能快速识别被篡改或实现错误导致的非法取值。

它的安全意义在于:UE记录安全激活发生时刻的算法集,此后任何一次K_AMF重推导(如mobility registration update)时,双方都把“上次激活的算法集”喂进KDF。如果中间存在攻击者把NGAP信令中的算法列表改弱(迫使UE和AMF选用80位安全强度的NEA1而非128位的NEA2),两侧算出的K_AMF就对不上,安全激活必然失败——降级攻击被转化为可检测的密钥不一致。这就是TS 33.501 Section 6.1.2.3所描述的"the ABBA parameter... protects against bidding down attacks"。


四、认证与密钥分发信令流:密钥材料何时出现在哪条消息里

把密钥层级映射到TS 23.502 Section 4.2.2.2.2定义的Primary Authentication流程(消息编号沿用该节),可以看到每级密钥“诞生”的精确时刻:

sequenceDiagram
    participant UE as UE/USIM
    participant AMF as AMF(SEAF)
    participant AUSF as AUSF
    participant UDM as UDM/ARPF

    Note over UE,UDM: 各方预置:K(USIM/ARPF)
    AMF->>AUSF: ① Nausf_UEAuthentication_Authenticate<br/>(SUCI, SN Name)
    AUSF->>UDM: ② Nudm_UEAuthentication_Get<br/>(SUCI, SN Name)
    UDM->>UDM: ③ SIDF解出SUPI,生成RAND/AUTN/XRES*<br/>K_AUSF = KDF(CK||IK, 0x6A, "5G-AKA")
    UDM-->>AUSF: ④ 5G HE AV (RAND, AUTN, HXRES*, K_AUSF)<br/>注意:XRES*与CK/IK不出UDM
    AUSF->>AUSF: ⑤ 由XRES*算HXRES*,暂存K_AUSF<br/>删除XRES*
    AUSF-->>AMF: ⑥ 5G SE AV (RAND, AUTN, HXRES*)
    AMF-->>UE: ⑦ Authentication Request<br/>(ngKSI, ABBA, RAND, AUTN)
    Note over UE: ⑧ USIM验证AUTN,产出CK/IK/RES*<br/>K_AUSF→K_SEAF→K_AMF本地全推导
    UE-->>AMF: ⑨ Authentication Response (RES*)
    AMF->>AUSF: ⑩ Nausf确认 (RES*)
    AUSF-->>AMF: ⑪ 校验RES*==XRES*,返回K_SEAF
    AMF->>AMF: ⑫ K_SEAF + SUPI + ABBA → K_AMF<br/>生成ngKSI标记安全上下文
    Note over UE,AMF: 此后NAS SMC(Security Mode Complete)<br/>激活K_NAS_int/enc,密钥链路闭合

三个值得协议工程师注意的细节:

  1. ngKSI(nas key set identifier):Authentication Request消息中携带,本质是K_AMF的“逻辑编号”。UE在同一AMF下可能持有多个安全上下文(不同ngKSI),后续NAS消息通过ngKSI+NAS COUNT定位唯一密钥。
  2. K_AUSF从不出现在SEAF侧:AUSF在步骤⑥只下发裁剪后的5G SE AV(其中RES已被替换为哈希HXRES),保证归属域密钥材料不整体暴露给访问域——这是5G-AKA相对4G-AKA的"one-shot anchor"改进。
  3. ABBA在第一条空口认证消息就出现:即使安全模式尚未激活,算法绑定的种子已经种下,UE侧的K_AMF推导与AMF侧完全同步。

五、核心机制:NH/NCC与切换时的水平、垂直密钥推导

这是本文的重点,也是现网切换掉话、安全模式失败排查中高频出错的一段。TS 33.501 Section 6.9定义了两种K_gNB获取方式:

NCC:决定“哪条推导路径”的裁判

NH(Next Hop)参数本身永不出现在UE和gNB之间,双方只同步一个3比特的计数器NCC(Next Hop Chaining Counter)。规则如下:

stateDiagram-v2
    [*] --> NCC0: 初始AS安全激活<br/>AMF垂直推导K_gNB, NCC=0<br/>同时预推NH(1), NCC=1
    NCC0 --> NCC1: Xn切换且源gNB有NH(1)<br/>水平推导K_gNB*, NCC=1
    NCC0 --> Vertical1: N2切换或NH缺失<br/>AMF垂直推导, NCC=1
    Vertical1 --> NCC1: 路径收敛
    NCC1 --> NCC2: Xn切换用NH(2)水平推导<br/>或N2切换垂直推导
    NCC2 --> NCC7: NCC逐次+1
    NCC7 --> NCC1: NCC=7后回绕到1<br/>触发AMF重跑认证上下文刷新

切换执行时,目标侧gNB通过HANDOVER COMMAND把新NCC带给UE;UE对比自己缓存的NCC与收到的NCC:

UE缓存的NCC 收到的NCC UE行为
= n = n+1 有对应NH缓存(水平推导过),用K_gNB*路径合成新K_gNB
= n > n+1 中间跳数过多(NH链断了),UE执行垂直推导:用K_AMF + UL NAS COUNT重新算K_gNB
= n < n 异常:NCC回退,视为网络错误,切换后NAS完整性校验必然失败

完整的Xn切换密钥流转时序如下:

sequenceDiagram
    participant SgNB as 源gNB
    participant TgNB as 目标gNB
    participant AMF as AMF
    participant UE as UE

    Note over SgNB: 持有K_gNB(n-1), NH(n), NCC=n
    SgNB->>TgNB: ① XnAP HANDOVER REQUEST<br/>K_gNB* = KDF(K_gNB(n-1), PCI_T, NCC=n)<br/>+ 新NCC=n
    TgNB->>TgNB: ② 合成 K_gNB(n) = K_gNB* ⊕-style合成 NH(n)<br/>(33.501定义的KDF合成,非异或)
    TgNB-->>SgNB: ③ XnAP HANDOVER REQUEST ACK
    SgNB->>UE: ④ RRCReconfiguration<br/>(handoverCommand, 新NCC=n)
    Note over UE: ⑤ UE比对NCC:缓存n-1,收到n → 可水平推导<br/>K_gNB* = KDF(K_gNB(n-1), PCI_T, NCC=n)<br/>UE同样合成NH得到K_gNB(n)
    UE->>TgNB: ⑥ RRCReconfigurationComplete<br/>(用新K_RRC_int保护)
    Note over UE,TgNB: 新AS安全上下文激活完毕<br/>AMF不知晓本次推导(Xn路径)

设计意图:Xn切换把密钥更新时延压到gNB之间(AMF不参与,省掉NGAP往返),但代价是AMF的K_AMF与现役K_gNB“脱节”——AMF必须把NH链预先生成好(每完成一次AS安全或N2切换,AMF就预推下一级NH),才能保证gNB随时有NH可用。NCC回绕到7之后系统强制回到垂直推导并由NAS层刷新安全上下文,防止无限链式推导导致的密钥材料代际模糊。


六、NAS COUNT:防密钥重用的最后防线

垂直推导K_gNB的输入是Uplink NAS COUNT,这个计数器有24位超帧号(overflow)+ 8位(TS 24.501 Section 9.2.3.1,实际构成5G NAS COUNT的32位逻辑空间)。UE每次上行NAS消息+1,AMF侧严格跟踪。如果UE上行消息丢失导致两侧COUNT失步,AMF会在下一次安全激活时发现推导不出一致密钥——这反过来成为检测NAS重放攻击的机制:攻击者重放旧的上行NAS消息,其加密/完整性标签对应的COUNT早已被网络“用过”,校验必败。

这也是为什么现网把NAS COUNT失步列为高危故障:它不仅影响认证推导,还会直接导致后续所有AS/NAS完整性校验连锁失败,UE只能重新注册。


七、实战连接:抓包识别与故障排查

7.1 抓包中如何定位密钥推导事件

7.2 常见故障点与排错思路

现象 根因定位方向 判据
切换后上行数据静默丢失、RRC重配完成不达 目标gNB未正确合成NH 对比XnAP HANDOVER REQUEST中的NCC与源gNB本地NH链状态
UE频繁发起re-registration,伴随integrity check fail NAS COUNT失步 抓NAS计数:UE侧上行COUNT vs AMF记录值;常见于测试USIM未实现overflow
Security Mode Command后UE不回Complete ABBA非法值(高字节≠低字节取反) 解码ABBA两字节,校验反码关系
N2切换后UE侧密钥错误 AMF垂直推导输入的UL NAS COUNT取值错误 检查AMF日志中推导时刻的COUNT与UE实际已发计数是否一致
NCC回退导致切换后必败 多AMF/多gNB间安全上下文同步缺陷 检查跨AMF N2切换(HANDOVER REQUIRED→HANDOVER COMMAND)中NCC IE的传递链
## 常见问题

Q: K_SEAF和K_AMF为什么不合并成一个密钥? A: 因为两者锚定的信任域不同。K_SEAF由归属域AUSF下发,代表“服务网络被授权使用该用户的认证结果”;K_AMF则进一步绑定UE身份(SUPI/SUCI)和ABBA算法集,属于特定UE-AMF对的安全上下文锚点。合并意味着AMF更换(如AMF change场景)时必须重新联系AUSF取密钥,而分离设计允许SEAF在不同AMF间(经K_AMF重推导)完成上下文迁移,减少归属域信令。

Q: 水平推导和垂直推导的本质区别是什么? A: 区别在于锚点密钥和触发路径:垂直推导以K_AMF为锚、由AMF执行、输入含UL NAS COUNT,用于初始激活和N2切换;水平推导以旧K_gNB为锚、由gNB执行、输入含目标PCI和新NCC,用于Xn切换。垂直推导安全代际更清晰但需要AMF参与,水平推导零核心网信令但每次链式推导都会累积对旧密钥的依赖。

Q: UE怎么知道自己该用水平还是垂直推导? A: UE不需要“知道”路径——它只对比切换命令中的NCC与本地缓存:NCC恰好+1且本地存有对应NH派生材料时走水平,NCC跳变时退回垂直推导(用K_AMF+UL NAS COUNT现算)。两条路径算出的K_gNB必然一致,因为AMF预推的NH与gNB水平推导的中间量在数学上设计为可合成出同一结果。

Q: 为什么认证后还要做Security Mode Command,不能在Authentication里直接激活NAS安全吗? A: 认证流程只建立了密钥材料(K_AMF),但算法协商需要AMF根据UE能力和网络策略另行决定,且NAS SMC消息本身要受完整性保护——这是一个“用密钥确认密钥”的自校验闭环:UE若未推导出正确的K_NAS_int,就无法通过SMC的MAC校验,激活自然失败。把两件事分开才能让认证失败和算法协商失败产生不同的错误码。

Q: 5G-AKA和EAP-AKA'的K_AUSF来源不同,会影响后面的密钥层级吗? A: 不会。两者的分叉点仅在K_AUSF:5G-AKA用KDF(CK‖IK, FC=0x6A, "5G-AKA")推导,EAP-AKA'直接取EAP主会话密钥EMSK作为K_AUSF。从K_SEAF开始的整棵密钥树完全相同,运营商可按归属域策略(是否要求服务网络标识绑定的EAP-AKA')任选,接入侧无感知。


参考来源

  1. 3GPP TS 33.501规范页(Security architecture and procedures for 5G System) — Section 6密钥层级、6.9 NH/NCC机制、Annex A各FC的KDF定义
  2. ETSI发布的TS 33.501各版本PDF目录 — 可下载Rel-15/16/17正式文本核对FC取值与ABBA定义
  3. 3GPP TS 23.502规范页 — Section 4.2.2.2.2 Primary Authentication流程与消息编号
  4. A Formal Analysis of 5G Authentication (CCS 2018, arXiv:1806.03656) — 对5G-AKA密钥绑定与不可链接性的符号化形式分析
  5. ShareTechNote: 5G/NR Security — 密钥层级图解与认证流程工程视角梳理

本文由「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学通信知识星球海报-扫码加入