5G 密钥派生链路:每级 KDF 的输入参数与所在实体
前两篇分别拆了注册流程的安全激活分界点和国密改造的完整链路,这篇补上中间最核心的一环:从根密钥 K 出发,各级密钥是怎么派生的,每一级 KDF 还喂了哪些”其它输入参数”,这些参数又是在哪个实体里参与运算的。
1. 派生链路总览
一句话概括:K 本身从不出卡,一切密钥都由它逐级推导而来,且每一级都混入不同的域分隔参数,上下级密钥之间无法互相倒推。整个链路里唯一的秘密就是上级密钥本身,其它输入要么公开可传,要么双侧协议保证同步。
下图标出了每一级的输入参数与所在实体(依据 3GPP TS 33.501,括号内为国密版替换点):
2. 各级派生的输入与所在实体
| 派生级 | 上级密钥 | 其它输入 | 所在实体 |
|---|---|---|---|
| CK/IK | K | RAND(f1/f5 另含 SQN、AMF 分离参数) | USIM 卡安全域 ↔ UDM/ARPF |
| K_ausf | CK‖IK | SNN(服务网络名) | UE 协议栈(ME)与 AUSF 各自派生 |
| K_seaf | K_ausf | ABBA(防降级参数) | AUSF 派生后交 SEAF |
| K_amf | K_seaf | SUPI + 接入类型 | SEAF 派生后交 AMF |
| KNASenc/int | K_amf | NAS 算法标识 | AMF 与 UE 各自派生 |
| K_gNB | K_amf | 上行 NAS COUNT | AMF 派生,经 N2 下发 gNB |
| KRRCenc/int · KUPenc/int | K_gNB | RRC/UP 算法标识 | gNB 与 UE 各自派生 |
国密版只改”用什么算”:所有 KDF 从 HMAC-SHA256 换成 SM3-HMAC,f2/f3/f4 用 SM4 派生;输入参数的结构完全不变——这也是 CK/IK 保持 128 bit 后,下游派生接口无需改动的原因。
3. 这些”其它输入”从哪来?
按获取机制可以归成四类:
① 网络生成、公开传输(挑战应答):RAND 由 UDM/ARPF 生成鉴权向量时产生,随 Authentication Request 经 AUSF→SEAF→基站明文下发。它本来就是要公开的——保密的不是挑战值,而是”只有持有 K 的卡才算得出正确应答 RES”。
② 双侧各自维护、天然同步的计数器:SQN(序列号)在 USIM 与 UDM 各存一份,每次鉴权各加一,藏于 AUTN 内用 AK 遮蔽(SQN⊕AK)传输——AK 本身不在链路上传,由两端用 f5(K,RAND) 各自算出(构造见下一节)——UE 检查”是否比卡里新”以防重放;上行 NAS COUNT 由 UE 和 AMF 对每条 NAS 消息各自计数,每发一条加一,为 K_gNB 提供新鲜性——每次注册值都不同,派生出的 K_gNB 也不同。
③ 公开或双侧已知的身份/配置信息:SNN 由 PLMN ID 按规范拼接(如 5G:mnc011.mcc460.3gppnetwork.org),UE 从广播的 SIB1 取 PLMN 拼出,网络侧由配置得知,让 K_ausf 只对当前网络有效;SUPI 存于 USIM,网络侧靠 SIDF 用 SM2 私钥解开 SUCI 得到;接入类型(3GPP/非3GPP)UE 自知,AMF 从注册信令得知;ABBA 现阶段为协议固定值 0x0000,保留给未来的降级防护扩展。
④ 安全模式命令协商:NAS 算法(NEA/NIA)由网络在 NAS SMC 提议、UE 确认;RRC/UP 算法在 AS SMC(即第一篇博文里那条消息)由 gNB 提议。协商完成后两侧各存一份,作为对应 KDF 的输入。
4. f1~f5:五个鉴权函数的构造
五个函数共享同一对输入 K + RAND(f1/f5 额外吃进 SQN/AMF),靠不同的构造方式区分角色。标准版(MILENAGE)以 AES-128 为核心——先算 TEMP = AES(K, RAND⊕OPc)(OPc 为运营商变体参数),再用不同轮常量与旋转派生五个输出;国密版把 AES 换成 SM4、散列换成 SM3-HMAC,接口与输出长度保持一致:
| 函数 | 作用 | 标准实现(MILENAGE) | 国密实现 |
|---|---|---|---|
| f1 | 网络认证码 MAC-A | AES 派生(输入含 SQN‖AMF),64 bit | SM3-HMAC(K, RAND‖SQN‖AMF) |
| f2 | 应答 RES / 期望应答 XRES | AES 派生,64 bit | SM4 加密派生(ECB/CBC) |
| f3 | 加密密钥 CK(128 bit) | AES 派生 | SM4 加密派生 |
| f4 | 完整性密钥 IK(128 bit) | AES 派生 | SM4 加密派生 |
| f5 | 匿名密钥 AK(遮蔽 SQN) | AES 派生 | SM3-HMAC(K, RAND) |
五个函数的分工可以这么记:f1 管”网络自证”,f2 管”UE 自证”,f3/f4 管”产钥匙”,f5 管”隐身”。AUTN 的构造为 AUTN = (SQN⊕AK) ‖ AMF ‖ MAC-A,其中 MAC-A 由 f1 算出,UE 端重算比对即可确认”这个挑战确实来自持有 K 的归属网”。由于国密版 f3/f4 输出仍为 128 bit 的 CK/IK,下游派生链(K_ausf 往后)接口完全不变。
5. AUTN 与 RES 的传递路径
AUTN 和 RES 不单独”传递”,它们作为认证消息的载荷,走归属网络 → 服务网络 → UE 的下行,再原路返回:
- ① AMF(SEAF)→ AUSF:发起认证请求,带上 SUCI 与服务网络名 SNN;
- ② AUSF → UDM/ARPF:取鉴权向量。UDM 生成 RAND,用 K 跑 f1~f5,产出 RAND、AUTN、XRES*,并由 CK/IK 算出 K_ausf;
- ③ 归属网只交出”半套”:AUSF 把 XRES* 哈希为 HXRES,仅将 RAND + AUTN + HXRES 交给 SEAF——完整 XRES* 与 K_ausf 留在归属网,被访网络被攻破也拿不到可伪造验证的数据;
- ④ SEAF → gNB → UE:RAND 与 AUTN 装入 NAS Authentication Request(N2 下发基站、RRC 转发),同时携带 ngKSI 与 ABBA;
- ⑤ UE 卡内验算:f5 解出 SQN 验新鲜度、重算 MAC-A 比对,通过后由 f2 算出 RES*;
- ⑥ 两段比对:RES* 经 Authentication Response 回传,SEAF 先与 HXRES* 比对(初验),AUSF 再与留存的 XRES* 比对(终验)。全部通过后鉴权成功,进入密钥派生链。
注意这些认证消息都是明文传输的——此时安全尚未激活(NAS/AS 加密要等 SMC 之后)。这没有问题:AUTN 的关键段已被 AK 遮蔽、MAC-A 保证完整性,RES* 的安全性完全依赖”算得出它就等于持有 K”。挑战应答的精髓就是信道可以公开,秘密只在端点。(对比 4G:EPS 把含 XRES 的完整鉴权向量整体下发给被访网络,5G 拆成 HXRES*/XRES* 两段比对,就是把根密钥材料尽量留在归属网。)
6. 设计不变量
每一级只把”下一级密钥”交给下游,上游密钥从不下发——拿到 K_gNB 的基站推不出 K_amf,拿到 K_seaf 的 AMF 也推不出 K_ausf,泄露面逐级收窄。配合每级不同的域分隔参数(SNN/ABBA/SUPI/COUNT),即使某一级密钥泄露,攻击者也无法向上倒推或跨网重放。
另外注意:SUCI 加密(SM2)不在 K 派生链上——它是身份保护支路,用运营商公钥加密 MSIN,和密钥派生是两个独立机制,只是恰好都在卡内完成。