首页 › deep-tech › 一把主钥,长出一棵密钥树

一把主钥,长出一棵密钥树:4G/5G密钥层级体系图解

上一轮我们聊过入网认证:手机和 network 之间互相“对暗号”,确认你是你、我是我。但认证只是握手,握手之后真正干活的是密钥。你刷视频的每一帧、发消息的每一个包,都是被密钥加密后送上空口的。

这里有一个值得停下来想的问题:认证明明拿到了根密钥,为什么不直接用它加密所有数据,非要再派生出十几把五花八门的子密钥?

这就要说到移动通信安全体系的骨架——密钥层级体系(Key Hierarchy)。

一、酒店房卡:一个足够好的类比

想象一家大酒店:

4G/5G的密钥体系就是按这套思路设计的:认证产生一把根,根再“生儿育女”,长成一棵树——信令一把钥匙、用户数据一把钥匙、完整性校验一把钥匙,换基站时树还分叉一次。

二、为什么不用一把钥匙走天下

直接拿根密钥加密一切,实现上最简单,为什么标准不这么干?四个理由,每一个都对应真实的攻击场景:

1. 爆炸半径控制。 一把钥匙开所有门,丢了就是全裸奔。信令密钥和用户面密钥分开后,用户数据那把即使出问题,攻击者也伪造不了信令,反之亦然。

2. 权限最小化。 基站只需要给手机收发数据,它不该有能力伪造核心网发给手机的注册确认。所以基站只能拿到接入层密钥,非接入层(NAS)密钥始终不离开手机和核心网——中间人手里根本没有那把钥匙。

3. 新鲜性。 密钥用得越久、加密的数据越多,被分析破解的材料就越多。层级体系让每次认证、甚至每次切换都产生新钥,旧钥作废。

4. 前向隔离。 换了基站之后,旧基站手里那把密钥推不出新基站的密钥。就算某台设备被攻破,影响也被限制在一个很短的时间窗内。

一句话总结设计哲学:树状结构不是为了好看,是为了让任何一次泄露的爆炸半径尽可能小。

三、密钥是“算”出来的,不是“传”出来的

这是整个体系里最容易被误解的一点,先说清楚:

空口上从来不传输任何密钥。 手机和网络的密钥,是双方各自用相同的材料、相同的算法,独立“算”出来的。两边算得一样,说明是同一把钥匙。

材料从哪来?手机里的SIM卡(USIM)和网络侧的签约数据库里,各自存着同一把根密钥K——这是用户入网时就写进去的、一辈子不更新的秘密。认证(AKA)时,双方用根密钥K加上一次性随机数,各自算出会话密钥CK和IK,再派生出主干密钥。因为随机数每次都不同,所以每次注册长出来的树都是全新的。

密钥推导用的工具叫 KDF(Key Derivation Function,密钥推导函数),5G/4G用的都是基于 HMAC-SHA256 的构造。它的直觉很好理解:

$$K_{新} = HMAC\text{-}SHA256(K_{旧},\ FC \,\Vert\, 输入参数)$$

HMAC本身长这样:

$$HMAC(K,\ m) = H\big((K \oplus opad) \,\Vert\, H((K \oplus ipad) \,\Vert\, m)\big)$$

不用被公式吓到,把HMAC想象成一台带密码锁的搅拌机:旧钥匙是密码,输入参数是水果,搅出来的果汁由密码和水果共同决定——不知道密码的人,就算看了一万杯果汁,也调不出下一杯的味道。

那个 FC 参数值得单独一提:它是一个字节的功能区分符,加上算法标识、目标标识等输入参数一起进搅拌机。这意味着派生NAS密钥和派生基站密钥时,搅拌机里放的“料”不同,出来的果汁必然不同。这就是“上下文绑定”——同一把KAMF派生出的所有子钥互不相关,想拿一把去冒充另一把,在数学上就行不通。

四、4G的密钥树:三层结构

4G这棵树长这样:

flowchart TD
    K["根密钥K<br/>USIM与AuC各存一份"]
    K --> CKIK["CK与IK<br/>认证时现算"]
    CKIK --> KASME["KASME<br/>核心网侧主钥"]
    KASME --> NAS1["KNASint<br/>NAS信令完整性"]
    KASME --> NAS2["KNASenc<br/>NAS信令加密"]
    KASME --> KENB["KeNB<br/>接入层主钥"]
    KENB --> RRC1["KRRCint<br/>RRC完整性"]
    KENB --> RRC2["KRRCenc<br/>RRC加密"]
    KENB --> UP1["KUPenc<br/>用户数据加密"]

读这棵树的正确方式是看每把钥匙“住”在谁家:

密钥 谁持有 保护什么 什么时候换
K(根) USIM + 网络签约库 一切的源头 终身不变
KASME 手机 + MME 整棵树的树干 每次认证重新长
KNASint / KNASenc 只有手机和MME NAS信令(注册、寻呼等) 安全模式激活时派生
KeNB 手机 + eNB 接入层一切 每次切换重新推
KRRCint / KRRCenc 手机 + eNB RRC信令 换KeNB即换
KUPenc 手机 + eNB 用户面数据 换KeNB即换

注意一个关键细节:KASME从不出MME,KeNB以下的密钥从不出基站。MME把KeNB交给eNB后就“失忆”,eNB拿不到NAS密钥;手机和MME之间的信令,基站全程只当搬运工,看不懂内容。这就是分层带来的权限隔离。

还有一个4G时代的历史局限:用户面只有加密钥匙KUPenc,没有完整性钥匙。也就是说4G的用户数据“上了锁但没贴封条”——没人能偷看,但理论上存在被篡改而不被察觉的空间。

五、5G重画了这棵树:修的是4G的三处暗伤

5G没有沿用4G的树,而是重新设计了。不是为了标新立异,是4G的设计确实有三处疼:

暗伤一:树干上挂太多东西。 4G里NAS密钥、基站主钥全从KASME直接派生。KASME一旦出问题,整棵树连根拔起。

暗伤二:核心网与接入网的密钥耦合太紧。 4G的树干长在MME身上,而5G的核心网是服务化架构,手机会频繁在不同AMF之间移动,密钥必须能跟着锚点走,而不是绑死在一个网元上。

暗伤三:用户面没有完整性保护。 前面说了,4G用户数据没贴封条。

5G的解法是在树干下面加一层中间钥,并把树干的名字从KASME换成KAMF:

flowchart TD
    K["根密钥K<br/>USIM与UDM各存一份"]
    K --> CK["CK'与IK'"]
    CK --> KSEAF["KSEAF<br/>归属网络锚定"]
    KSEAF --> KAMF["KAMF<br/>AMF持有"]
    KAMF --> NAS1["KNASint<br/>NAS完整性"]
    KAMF --> NAS2["KNASenc<br/>NAS加密"]
    KAMF --> KGNB["Kgnb与Kng-enb<br/>接入层主钥"]
    KGNB --> RRC1["KRRCint<br/>RRC完整性"]
    KGNB --> RRC2["KRRCenc<br/>RRC加密"]
    KGNB --> UP1["KUPenc<br/>用户数据加密"]
    KGNB --> UP2["KUPint<br/>5G新增"]

新旧两棵树放在一起看,差异一目了然:

维度 4G 5G
树干(锚点钥) KASME,住在MME KAMF,锚定在AMF,可随移动更新
树的层数 主钥直派子钥 主钥→中间钥(Kgnb)→叶钥
用户面完整性 不支持 支持KUPint,由网络决定是否启用
空口算法密钥长度 128位 内部256位,进算法前截128位
树的身份标识 无显式标识 ngKSI标记当前是哪一代KAMF
非3GPP接入(WiFi) 另起炉灶 同一棵树可派生Kn3iwf

几个新角色的白话解释:

六、把钥匙交到手机手里:安全模式激活流程

树画得再漂亮,也得落地。注册完成后,密钥通过“安全模式激活”流程真正生效。整个过程最反直觉的地方是:即使在这一步,密钥也不上线传输,上线传的只是“算法选择”和“树牌号”:

sequenceDiagram
    participant UE as 手机
    participant AMF as 核心网AMF
    participant NB as 基站
    Note over UE,AMF: 认证已完成<br/>双方各自算出KAMF
    AMF->>UE: NAS安全模式命令<br/>带算法标识与ngKSI
    Note over UE,AMF: 两端独立派生NAS密钥
    UE->>AMF: NAS安全模式完成<br/>已受新钥保护
    AMF->>NB: 推导Kgnb并下发
    NB->>UE: AS安全模式命令
    UE->>NB: AS安全模式完成
    Note over UE,NB: 空口信令与数据<br/>从此全程加密加验

看懂这个时序,你就看懂了抓包里最常见的几条安全信令。两个值得品味的细节:

  1. 先NAS后AS。 核心网先把最高层的信令通道锁上,锁好之后才给基站发钥匙。顺序反了就会出现“通道还没上锁就送钥匙”的窗口。
  2. “安全模式完成”本身受新密钥保护。 如果两边算出的密钥不一致,这条完成消息的完整性校验立刻失败——不一致这件事自动暴露,不需要额外的对账机制。这个设计很优雅:用保护本身来验证保护。

七、换基站时,树怎么分叉

移动中的手机会不断切换基站。新基站怎么拿到密钥?答案是现场推导,业内叫“水平推导”(与之相对,重新认证后从树干重新长树叫“垂直推导”):

flowchart TD
    A["切换前<br/>源基站持有K1"] -->|收到切换请求| B["查目标小区门牌号"]
    B --> C["源基站推算新钥K2"]
    C -->|K2经切换命令转交| D["目标基站"]
    B -->|门牌号同时告诉手机| E["手机用K1自算K2"]
    D --> F["两端同钥<br/>业务无缝衔接"]
    E --> F

精髓在“门牌号”:派生K2的输入参数里混入了目标小区的物理标识和频点。这带来两个性质:

如果手机做的是重新认证(比如周期性注册到了期限、或者换了AMF),那就走垂直推导:从KSEAF重新派生一棵全新的KAMF树,旧树整棵废弃。

八、叶子上长什么算法

树的最末端,每把叶钥都要交给一个具体算法执行加密或校验。4G和5G用的是同一家族,只是换了名字(4G叫EEA/EIA,5G叫NEA/NIA):

算法标识 底层算法 干什么用 备注
NEA0 / NIA0 空算法 不加密/不校验 为监管拦截、应急呼叫等场景预留
NEA1 / NIA1 SNOW 3G 流加密/完整性 4G时代的主力,5G沿用
NEA2 / NIA2 AES 流加密/完整性(AES-CMAC) 当前现网最常用
NEA3 / NIA3 ZUC(祖冲之) 流加密/完整性 中国自主设计

手机和基站怎么选?安全模式命令里带着优先级列表:网络按自己的策略从高到低挑一个双方都支持的。注意算法协商走的是明文信令,但协商结果进入密钥派生的输入参数——即使攻击者在空口看到“我们用NEA2吧”,也无法据此推算任何密钥。

九、现网实战:这些知识用在哪

抓包排查安全类问题。 在N2接口抓包,注册前几条NAS消息是明文的;安全模式激活之后的NAS消息全部变成密文容器——这是正常现象,因为NAS密钥只在手机和AMF手里,基站都解不开。想看明文得去AMF内部日志或UE侧。新手常在这里误判为“信令异常”。

三类经典故障的指纹:

现象 高概率根因 排查方向
注册卡死在安全模式、循环重试 算法协商不匹配,或AMF与USIM密钥不同步 比对两侧支持的算法列表、查认证向量是否被重复使用
切换成功但立刻掉话 水平推导的目标小区参数有误,两端密钥对不上 查切换命令里的目标标识与实际小区是否一致
信令全通、业务全断 网元重启后密钥上下文丢失,或加密板卡加解密结果不一致 查密钥状态同步、比对板卡与软件的加解密输出

一个隐蔽的调试陷阱: 安全算法是网络级配置,改一处影响全网。曾有工程师为了排查某终端兼容性问题把某算法全网降级,结果引发大面积安全模式重试风暴。这类密钥层的参数,动之前先想清楚爆炸半径——这个体系的全部设计,就是为了把爆炸半径关小,别亲手把它放大。

十、三个常见误解

“开了加密就安全了。” 不对。加密管偷看,完整性管篡改,是两把不同的锁。5G给用户面补上KUPint,就是因为业界意识到只加密不校验的数据可以被定向篡改而不被发现。

“密钥肯定在网上传过。” 从头到尾没有。根密钥写卡时就不上线,之后所有密钥都是两端各自推导的。抓包抓到的只有算法选择和标识号。

“NEA0是安全漏洞。” 空算法是故意保留的选项,服务于监管合法拦截、应急语音等特殊场景。用不用是网络策略,不是标准缺陷。

常见问题

Q: K、KASME、KAMF到底什么关系?分别存在哪? A: K是根,写死在USIM和网络侧签约库里,终身不变;KASME(4G)和KAMF(5G)是每次认证后从根上现算出来的树干,只存在于手机和核心网(MME/AMF)里,注册结束或重新认证就作废。一句话:K是户口本,KAMF是这次入住的房卡。

Q: 有了加密,为什么非要完整性保护? A: 加密保证“别人看不懂”,完整性保证“别人改不了”。两者独立:没有完整性校验的密文,攻击者虽然读不出内容,但可以翻转密文中的比特,让解密结果朝预期方向变化。信令被篡改的后果(比如改掉注册结果)往往比窃听严重得多。

Q: 切换后,旧基站还能解密我的数据吗? A: 旧钥推不出新钥,水平推导是单向的。旧基站在切换瞬间手里短暂持有过交给新站的钥匙,但那把钥匙只对目标小区有效,且标准用切换链计数器限制了它的使用边界。越往后切换,离旧基站的密钥越远。

Q: SUCI加密和这棵密钥树是一回事吗? A: 不是,两条独立的线。SUCI是用运营商公钥把用户永久标识加密,解决的是“注册第一条消息里不裸奔身份证”的问题,属于隐私线;密钥树解决的是注册成功之后的“数据保密与防篡改”,属于机密性线。前者靠非对称加密,后者靠对称密钥推导。

Q: 为什么空口不直接用一把AES密钥加密所有东西? A: 一把钥意味着一次泄露全线崩盘、基站能看到核心网信令、旧钥永远有效、换站必须重新传钥。层级体系用一棵树的复杂度,换来爆炸半径最小、权限最小化、密钥定期换新这三重保险——这笔账,在安全领域永远划算。

参考来源

  1. 5G - Wikipedia — 5G安全特性综述,含用户标识保护与空口加密说明
  2. Authentication and key agreement - Wikipedia — AKA挑战应答机制与CK/IK密钥的产生方式
  3. Home subscriber server - Wikipedia — 用户签约密钥的存放位置与认证向量下发流程
  4. HMAC - Wikipedia — 密钥推导函数的底层构造原理
  5. 3GPP官网 — 移动通信安全标准体系的一手资料入口

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