聚焦 3GPP TS 33.501 Annex C 与 Clause 6.12,从 UE 侧 ECIES 公钥加密到 UDM/SIDF 私钥解密的完整密码学与信令链路。
在 2G/3G/4G 时代,用户永久标识符(IMSI)在初始附着时以明文方式通过空口广播。攻击者只需一台伪基站(IMSI Catcher),就可以主动触发 Attach Request,被动监听并采集 IMSI,进而构建大规模用户位置与身份画像库。这一隐私缺陷的根源在于:永久标识符必须在网络识别用户之前先被发送,而明文发送本身即构成泄露面。
3GPP 在设计 5G 时,将"标识符隐私"(Identity Confidentiality)作为 R15 安全架构的一等公民写入 TS 33.501。其核心思路是:在 UE 侧用归属网络(Home Network)的公钥对 SUPI(Subscription Permanent Identifier)进行非对称加密,生成临时的、每次可变的 SUCI(Subscription Concealed Identifier);只有持有对应私钥的归属网络才能还原 SUPI。这样,即使伪基站截获 SUCI,也无法将其与某次会话之外的任何历史记录关联——因为 SUCI 每次都不同(临时密钥每次随机生成)。
这一机制本质上是把"明文 IMSI"这一隐私攻击入口关闭,代价是引入了基于 ECIES(Elliptic Curve Integrated Encryption Scheme)的公钥加密体系和一个专用的去隐藏网元功能 SIDF。本文将完整拆解这条链路:从 SUCI 的字节结构、三种保护方案、UE 侧 ECIES 加密流程,到注册信令中 AMF 与 UDM/SIDF 的交互,再到抓包识别与故障排查。
SUCI 不是简单的"加密后的字符串",而是一个有明确字段编排的结构化标识符,定义于 TS 23.003 Clause 2.10。其结构如下图所示:
flowchart LR
SUCI[SUCI] --> T["SUPI Type<br/>(IMSI / Network Specific)"]
SUCI --> HN["Home Network ID<br/>MCC + MNC(明文)"]
SUCI --> RI["Routing Indicator<br/>(明文,路由用)"]
SUCI --> PS["Protection Scheme Id<br/>0=Null / 1=ProfA / 2=ProfB"]
SUCI --> PKI["HN Public Key Id<br/>(0~255)"]
SUCI --> SO["Scheme Output<br/>(加密载荷)"]
SO --> SO1["Ephemeral Public Key R"]
SO --> SO2["Encrypted MSIN C*"]
SO --> SO3["MAC Tag"]
各字段的含义与作用如下表(TS 23.003 Clause 2.10、TS 33.501 Clause 5.9):
| 字段 | 长度/取值 | 明文/密文 | 作用 |
|---|---|---|---|
| SUPI Type | 4 bit | 明文 | 指示 SUPI 类型:0=IMSI(最常见),1=Network Specific Identifier |
| Home Network ID | MCC(3位)+MNC(2~3位) | 明文 | 归属网络标识,用于路由到归属网络 |
| Routing Indicator | 1~4位十进制 | 明文 | 指示路由到归属网络的哪个 SIDF 实例,便于部署多 SIDF 分流 |
| Protection Scheme Id | 4 bit | 明文 | 0=Null-scheme,1=ECIES Profile A,2=ECIES Profile B |
| HN Public Key Id | 8 bit (0~255) | 明文 | 标识使用哪一对归属网络公私钥(支持密钥轮换) |
| Scheme Output | 变长 | 密文 | 加密后的内容,结构由具体 Protection Scheme 决定 |
设计要点:注意 Home Network ID(MCC+MNC)与 Routing Indicator 是明文的——因为它们必须被中间网元(如 AMF、拜访网络)用于把信令路由到正确的归属网络 SIDF,不可能加密。真正被保护的是 Scheme Output 中的 SUPI 有效载荷(对于 IMSI 类型,即 MSIN 部分)。攻击者即使知道"这是归属到运营商 X 的某用户",也无法得知该用户是谁——这正是 SUCI 提供的隐私粒度。
需要特别强调:对于 IMSI 类型的 SUPI,被加密的只是 MSIN(移动用户识别号),而 MCC+MNC 保留在明文头部。这是出于路由效率的折中——MCC+MNC 本身只暴露"哪个运营商的用户",在隐私模型中被视为可接受的泄露。
TS 33.501 Annex C 定义了三种保护方案。UE 选择哪一种,取决于 USIM 卡中 EF_SUCI_Calc_Info 文件(TS 31.102)是否预置了归属网络公钥。
当 USIM 没有预置归属网络公钥时,UE 必须使用 Null-scheme。其本质是"不加密":Scheme Output 直接就是明文 MSIN(对 IMSI 类型)。此时 SUCI 提供的隐私保护等同于 4G——即不提供永久标识符隐藏。Null-scheme 的存在是为了保证后向兼容性,让旧式 USIM 也能接入 5G 网络。
Null-scheme 下,Scheme Output 仅包含 MSIN 的十进制表示,没有 Ephemeral Public Key 和 MAC Tag。
当 USIM 预置了公钥时,UE 使用 ECIES 方案。两个 Profile 的差异在于底层椭圆曲线与部分密码学参数:
| 维度 | ECIES Profile A | ECIES Profile B |
|---|---|---|
| 规范出处 | TS 33.501 Annex C.2 | TS 33.501 Annex C.3 |
| 椭圆曲线 | Curve25519(X25519) | secp256r1(NIST P-256) |
| 曲线阶位数 | 255 bit | 256 bit |
| 公钥编码 | 32 字节(u-coordinate) | 33 字节压缩 / 65 字节未压缩 |
| ECDH 共享秘密推导 | X25519 标量乘 | secp256r1 标量乘 |
| KDF | HKDF-SHA256 | HKDF-SHA256 |
| 对称加密 | AES-128 in CTR mode | AES-128 in CTR mode |
| MAC 构造 | Annex C.2.4 定义 | Annex C.3.4 定义(HMAC-SHA-256) |
| Scheme Output 组成 | R ‖ C* ‖ MAC | R ‖ C* ‖ MAC |
为什么要有两个 Profile? 这是一个典型的标准政治学产物:
3GPP 不愿在两者之间做单选,于是把选择权交给运营商:归属网络决定预置哪种公钥,UE 据此使用对应 Profile。这也意味着,UE 必须同时支持 Profile A 和 Profile B 的解算逻辑,由 USIM 中的 Protection Scheme Id 字段动态决定。
UE(确切地说是 USIM,参见 TS 31.102 的 SUCI calculation profile)在发起初始注册前,对 SUPI 执行 ECIES 加密。完整流程如下:
flowchart TD
IN["输入: MSIN(明文)<br/>+ 归属网络公钥 PK"] --> GEN["① 生成临时私钥 d(随机数)<br/>计算临时公钥 R = d * G"]
GEN --> ECDH["② ECDH 共享秘密推导<br/>SS = f(d, PK)"]
ECDH --> KDF["③ KDF 派生对称密钥<br/>K = HKDF-SHA256(SS)<br/>K_e = K[0:16], K_mac = K[16:32]"]
KDF --> ENC["④ 加密: C* = AES-128-CTR(K_e, MSIN)<br/>计数器从 0 开始"]
ENC --> MAC["⑤ 计算 MAC Tag<br/>tag = MAC(K_mac, C*)"]
MAC --> OUT["⑥ 拼装 Scheme Output<br/>= R ‖ C* ‖ tag<br/>并组装完整 SUCI"]
逐步解析每个步骤中的关键 Information Element:
① 临时密钥对生成:UE 每次计算 SUCI 都生成一个全新的临时私钥 d(一次性随机数)和对应的临时公钥 R = d * G。这是 SUCI"每次可变"的根本来源——即使加密同一个 SUPI,由于 d 不同,R、共享秘密、密文、MAC 全部不同。这保证了前向隐私和不可关联性(un-linkability)。
② ECDH 共享秘密:UE 用临时私钥 d 与归属网络公钥 PK 做椭圆曲线 Diffie-Hellman,得到共享秘密 SS = d · PK = d · (s · G) = s · R,其中 s 是归属网络的私钥。注意 UE 不知道 s,但 ECDH 协议保证 UE 算出的 SS 与 SIDF 用 s 和 R 算出的 SS 完全一致。
③ KDF 密钥派生:用 HKDF-SHA256 从共享秘密 SS 派生出两个对称密钥:加密密钥 K_e(16 字节)和 MAC 密钥 K_mac(16 字节)。HKDF 的 info 参数固定为 "SUCI shared secret"(Annex C.2.2),盐值取归属网络公钥的编码。
④ 对称加密:用 K_e 对 MSIN 做 AES-128-CTR 加密。CTR 模式将 MSIN 视为字节流,初始计数器(counter block)固定为全 0。CTR 模式的选择是因为它无需填充(padding-free),对变长 MSIN 友好。
⑤ MAC 计算:用 K_mac 对密文 C* 计算认证标签 tag。这一步提供完整性保护——防止攻击者篡改密文导致 SIDF 解出错误的 MSIN。
⑥ Scheme Output 拼装:Scheme Output = R ‖ C* ‖ tag,即临时公钥、密文、MAC 标签三段拼接,再封装进 SUCI 的完整结构(含明文头部)。最终 SUCI 通过 NAS Registration Request 发送。
设计意图:整个 ECIES 是一个标准的"密钥封装 + 数据封装"混合加密(KEM/DEM)结构。ECDH 完成密钥协商(KEM),AES-CTR + MAC 完成数据保护(DEM)。之所以不用纯 RSA 直接加密,是因为椭圆曲线在同等安全强度下密钥更短(256 bit vs 3072 bit)、计算更快,更适合 UE/USIM 这种资源受限环境。
SUCI 的生命发生在初始注册流程中(TS 23.502 Clause 4.2.2)。关键信令交互如下:
sequenceDiagram
participant UE
participant AMF
participant UDM as UDM / SIDF
participant UDR as UDR
UE->>AMF: ① Registration Request<br/>(携带 SUCI in 5GS Mobile Identity)
Note over UE,AMF: 空口传输 SUCI<br/>攻击者只能看到 SUCI
AMF->>UDM: ② Nudm_UEAU_GenerateAuthData<br/>(SUCI, Serving Network Name)
Note over UDM: ③ SIDF 去隐藏<br/>ECDH: SS = s · R<br/>派生 K_e/K_mac, 验 MAC, 解密
UDM->>UDR: ④ Nudr_Query(SUPI)<br/>按还原的 SUPI 查订阅数据
UDR-->>UDM: 返回 K, OPC, 算法列表
Note over UDM: ⑤ 用 SUPI 与永久密钥 K<br/>生成认证向量 AV
UDM-->>AMF: ⑥ 返回 Authentication Vector<br/>(RAND, AUTN, XRES*)
AMF->>UE: ⑦ Authentication Request<br/>(RAND, AUTN, ngKSI)
Note over UE: ⑧ UE 验证 AUTN<br/>(5G AKA / EAP-AKA')
UE-->>AMF: Authentication Response(RES*)
逐条消息解析关键 IE:
消息① Registration Request:UE 在 5GS Mobile Identity 信息元素中携带 SUCI。该 IE 的 Type of Identity 字段指示这是 SUCI(而非 5G-GUTI 或 IMEI)。当 UE 没有 5G-GUTI(首次注册或 GUTI 失效)时,必须用 SUCI。注意:如果 UE 有有效的 5G-GUTI,会优先用 GUTI(因为 GUTI 本身已是临时标识,无需 SUCI)——SUCI 主要在 GUTI 不可用的场景出现。
消息② Nudm_UEAU_GenerateAuthData:AMF 收到 SUCI 后,调用 UDM 的认证服务(TS 29.503),将 SUCI 透传给 UDM。AMF 不解析、不解密 SUCI——它没有私钥,也没有这个能力。AMF 只是搬运工。这里还携带 Serving Network Name(服务网络名),用于后续 5G AKA 的密钥派生。
③ SIDF 去隐藏:UDM 内的 SIDF 子功能(TS 33.501 Clause 6.12)执行 ECIES 解密:
flowchart TD
A["输入: SUCI 的 Scheme Output<br/>R, C*, tag + 归属网络私钥 s"] --> B["① ECDH 共享秘密<br/>SS = s · R"]
B --> C["② KDF 派生<br/>K_e, K_mac(与UE侧完全相同)"]
C --> D["③ 验证 MAC: tag' ?= MAC(K_mac, C*)"]
D -->|验证失败| X["拒绝, 返回错误"]
D -->|验证成功| E["④ 解密: MSIN = AES-128-CTR⁻¹(K_e, C*)"]
E --> F["⑤ 重组 SUPI<br/>= MCC + MNC(明文头) + MSIN"]
F --> G["输出: 明文 SUPI 供后续认证使用"]
④⑤ 查询与生成认证向量:还原 SUPI 后,UDM 用 SUPI 作为主键向 UDR 查询订阅数据(永久密钥 K、OPC、认证算法列表),然后用 5G AKA 或 EAP-AKA' 流程生成认证向量 AV(含 RAND、AUTN、XRES)。这一步的前提就是 SIDF 先把 SUPI 还原出来*——没有 SUPI,UDM 根本不知道查哪个用户。
⑥⑦⑧:认证向量返回 AMF,AMF 下发 Authentication Request,UE 验证网络身份后返回 RES,完成 5G AKA 主认证(这部分见作者前序《5G AKA 主认证双确认机制全链拆解》)。值得强调:SUCI 去隐藏发生在主认证之前*,是认证能够启动的前置条件。
SIDF(Subscription Identifier De-concealing Function)在架构上是 UDM 的一个功能,但 TS 33.501 Clause 6.12 对其安全定位有严格规定:
s 只能存放在 SIDF(及承载它的硬件安全模块 HSM 中)。任何其他网元(AMF、SMF、AUSF)都不得持有私钥,从而将私钥泄露面收敛到最小。为什么不把去隐藏做成分布式? 因为私钥分发即等于泄露面扩大。集中式 SIDF 是"安全 vs 性能"权衡中明确选择安全的典型案例——宁可牺牲一点可扩展性,也要确保永久标识符的解密能力集中可控。
理解 SUCI/SIDF 的设计,需要回到三个核心矛盾:
矛盾一:永久标识符必须先于认证发送。 网络在认证用户之前,必须先知道"用户是谁"才能查到对应的认证密钥。这意味着标识符的发送是无条件、无会话的。明文发送是 4G 的缺陷;SUCI 用公钥加密把这个"必须先发送"的泄露面加密掉。
矛盾二:每次加密结果必须不同(不可关联性)。 如果两次加密同一 SUPI 得到相同 SUCI,攻击者就能跨会话关联同一用户。ECIES 的临时密钥 d 每次随机,确保 SUCI 每次不同,从密码学上保证不可关联性。这是相比"固定对称密钥加密"方案的关键优势。
矛盾三:去隐藏能力必须可控。 私钥若分散存放,任一节点被攻破即全盘泄露。SIDF 集中化 + HSM 隔离,把去隐藏能力变成网络中受保护程度最高的"皇冠上的明珠"。
一个常被忽略的设计:SUCI 只保护永久标识符,不保护后续信令。注册成功后,AMF 会分配 5G-GUTI,后续信令用 GUTI 临时标识。SUCI 与 GUTI 形成"双保险"——SUCI 保护首次出现的永久标识符,GUTI 保护后续所有交互。两者职责不同,互补而非替代。
在 Wireshark/TShark 抓取 NGAP + NAS 信令时,识别 SUCI 的要点:
5GS Mobile Identity IE:若 Type of identity = SUCI(值 4),则该字段为 SUCI。SUPI format 子字段指示是 IMSI 类型还是 Network Specific 类型。Protection scheme identifier 显示是 Null(0)、Profile A(1)还是 Profile B(2)。Home network public key identifier 显示使用的公钥 ID。若在空口抓包看到 5GS Mobile Identity 的 Type of identity 显示为 IMSI 或 SUCI scheme = Null-scheme 且 MSIN 明文可见,说明该用户未启用 SUCI 保护(USIM 未预置公钥),这是隐私降级场景。
| 故障现象 | 可能原因 | 排查思路 |
|---|---|---|
| AMF 转发 SUCI 后 UDM 返回失败 | SIDF 私钥与 USIM 公钥不匹配(公钥 ID 错配) | 核对 USIM EF_SUCI_Calc_Info 的公钥 ID 与 UDM/SIDF 持有私钥的 ID 是否一致 |
| SUCI 去隐藏成功但 SUPI 错误 | KDF 的 info 参数实现不一致(厂商差异) | 抓包对比 UE 侧与 SIDF 侧的 HKDF info 字符串是否为 "SUCI shared secret" |
| MAC 验证失败导致去隐藏被拒 | Curve25519 vs secp256r1 协商不一致 | 检查 Protection Scheme Id,确保 UE 与 SIDF 支持同一 Profile |
| 频繁 SUCI 解密失败 | 网络未预置公钥,UE 回退 Null-scheme | 确认 USIM 是否写入公钥;检查是否运营商未启用 SUCI 服务 |
| ## 九、常见问题 |
Q1: SUCI 和 5G-GUTI 有什么区别?为什么需要两个? A: SUCI 是加密后的永久标识符(含 SUPI 的加密载荷),用于首次注册或 GUTI 失效时;5G-GUTI 是 AMF 分配的临时标识符,用于后续所有信令。SUCI 由 UE 用公钥加密生成,GUTI 由 AMF 明文分配。两者互补:SUCI 解决"永久标识符首次发送"的隐私问题,GUTI 解决"日常交互"的隐私问题。一旦拿到 GUTI,UE 就不再发送 SUCI,减少 SUCI 出现频率。
Q2: Null-scheme 下 SUCI 还提供隐私保护吗? A: 不提供。Null-scheme 的 Scheme Output 就是明文 MSIN,隐私等级等同于 4G 的明文 IMSI。3GPP 保留 Null-scheme 纯粹是为兼容未预置公钥的旧 USIM 卡,是过渡性方案。运营商启用 SUCI 服务的标志就是向 USIM 预置公钥并指定 Profile A 或 B。
Q3: 攻击者拿到大量 SUCI 能否暴力破解 SUPI?
A: 在密码学上不可行。SUCI 基于 ECIES,其安全性依赖 ECDH 的离散对数难题(Curve25519/secp256r1)和 AES-128/HMAC 的对称安全性。攻击者没有私钥 s,无法从 SUCI 还原 MSIN。唯一可行的攻击是针对私钥持有方(SIDF/HSM)的攻击或侧信道攻击,这正是 SIDF 集中化 + HSM 隔离要防御的。
Q4: 归属网络公钥可以更新吗?更新后旧 SUCI 怎么办? A: 可以更新,通过 Public Key Id(0~255)区分不同代的公钥。USIM 通过 EF_SUCI_Calc_Info 可预置多个公钥及 ID,UE 计算时携带所用 ID,SIDF 据此选对应私钥解密。这样在密钥轮换期间,新旧 SUCI 都能被正确去隐藏,实现无中断的密钥更新。
Q5: 为什么 SUCI 头部(MCC+MNC)不加密? A: 因为 MCC+MNC 必须用于路由——拜访网络的 AMF 需要依据明文 Home Network ID 把信令路由到正确的归属网络 UDM。若加密头部,路由就无法进行。隐私模型认为"暴露是哪个运营商的用户"是可接受的,真正敏感的"是哪个具体用户(MSIN)"才需要加密。
本文由「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 等场景全覆盖。
