首页 › deep-tech › 一字一密:空口流密码原理

一字一密:空口流密码原理

一、上锁,是安全链条的最后一环

前面我们已经聊过两篇安全话题:一篇讲入网认证——手机和网络如何“对暗号”确认彼此身份;一篇讲密钥层级——认证成功后,如何从一把根密钥“长出”一棵密钥树,给不同层、不同域派生各自的钥匙。

但还有一个关键问题悬而未决:钥匙到手之后,锁到底是怎么转的?

想象你寄一件贵重物品。认证相当于快递员核对你的身份证,密钥派生相当于你从总钥匙串上取下配好的钥匙,而加密才是真正把物品锁进箱子、让小偷撬不开的动作。本篇就拆这个“锁”:空口数据加密用的是流密码(Stream Cipher),它是整个移动通信安全体系里的执行层——认证再完美、密钥树再精巧,最终替你挡住窃听者的,是这几个每秒运行几百万次的异或运算。

二、从“一次一密”说起:香农给出的完美答案

1949年,香农证明了密码学里唯一被数学证明绝对不可破的加密方案,叫“一次一密”(One-Time Pad)。它的原理简单到令人发指:

$$C_i = P_i \oplus K_i$$

明文的每一个比特,都与一个随机密钥比特做异或(XOR)。接收方拿同样的密钥再异或一次,明文就还原了:

$$P_i = C_i \oplus K_i$$

异或这个运算有个可爱的对称性:同一个数异或两遍,等于什么都没做。加密和解密是同一个动作,这为硬件实现省了 enormous 的麻烦。

香农证明:只要密钥满足三个条件——真随机、与明文等长、绝不重复使用——密文就不再泄露明文的任何统计信息,哪怕对手拥有无穷算力也无可奈何。这就是“完美保密”。

但工程上一看,三个条件全是死结:

香农的条件 工程上的困境
密钥必须真随机 手机和基站之间没法预先共享一条无限长的随机磁带
密钥与明文等长 你刷一小时视频,得先安全地传送一小时视频长度的密钥
密钥绝不重复 每传一个比特就要消耗一个密钥比特,分发成本无穷大

一次一密就像用整个保险柜包装一件戒指——安全是安全了,但没法送货。

三、流密码:把长密码本压缩成一颗种子

工程上的破局思路是:别传密码本了,传“生成密码本的方法”。

双方只共享一个很短的种子——128比特的密钥,加上128比特的初始向量(IV)。两边的密钥流生成器各自用这颗种子,独立地“搅拌”出一条看似随机的、要多少有多长的密钥流(Keystream)。发送端拿密钥流逐比特异或明文,接收端拿同一条密钥流逐比特异或密文。

flowchart TD
    A["一次一密 OTP"] -->|密钥与明文等长 无法分发| B["工程死结"]
    B --> C["流密码: 种子代替密码本"]
    D["128 位密钥 KEY"] --> E["密钥流生成器"]
    F["128 位初始向量 IV"] --> E
    E -->|每拍输出 32 位| G["密钥流"]
    G -->|异或| H["明文变密文"]
    G -->|接收端同样异或| I["密文还原明文"]

密钥流虽然是用确定性算法生成的(所以严格叫“伪随机”),但只要生成器设计得当,统计上与真随机几乎无法区分,安全性依然很高。这就完成了一次漂亮的工程转换:把“安全传输一整本密码本”的问题,压缩成“安全持有128比特种子”的问题。而那128比特种子,正是认证之后密钥树派生出来的加密密钥——前面两篇的伏笔,在这里正式合龙。

四、生成器的心脏:线性反馈移位寄存器

密钥流生成器的主流“心脏”,是一种古老而优雅的数字电路——线性反馈移位寄存器(LFSR)。

想象一排串联的寄存器格子,每拍时钟,所有比特整体向左移一格,最左边空出的位置由某些格子的异或组合填入。就这么个动作,只要“反馈抽头”选得讲究,一排31格的寄存器就能循环吐出长达 $2^{31}-1$ 拍才重复的序列——这种最长周期的序列叫 m序列,它的统计特性好得出奇:0和1几乎各占一半,自相关像白噪声一样尖锐。

通信工程师爱LFSR爱到骨子里,原因很现实:

但线性恰恰是它的命门。LFSR的输出是输入的线性组合,而线性方程是可以解的。经典攻击方法是:截获足够长的已知明文-密文对,恢复出一段密钥流,然后用 Berlekamp-Massey 算法反推出整个寄存器的反馈结构——只要 $2n$ 比特已知密钥流,就能破掉 $n$ 级纯LFSR。种子一露,密钥流全线崩溃。

所以实战中的密钥流生成器,从来都是“LFSR + 非线性混淆”的组合拳:让LFSR负责长周期和好统计,再让一个非线性的“搅拌函数”负责把线性结构搅碎,让破解者无法用线性代数一锅端。三大空口算法全都是这个套路的变体。

五、三大算法巡礼:欧洲、美国与中国各一把锁

空口加密的算法菜单上,长期摆着三把锁。它们解决同一个问题,却体现了三种不同的设计哲学。

项目 SNOW 3G AES ZUC 祖冲之
出身 欧洲 ETSI SAGE 设计 美国 NIST 标准 中国设计,2011 年进入国际标准
类型 流密码 分组密码(空口里按计数器模式当流密码用) 流密码
核心结构 16 级 32 比特 LFSR + 三寄存器有限状态机 代换-置换网络 SPN,逐块加密计数器 31 级 31 比特 LFSR + 非线性函数 F
每拍产出 32 比特密钥流字 每加密一个计数器得一个块 32 比特密钥流字
特点 4G 时代的祖传算法,兼容 3G 遗产 通用性强、软硬件生态最全 硬件省、速度快,中国商用密码体系的一员

AES 是“借调”来的。它本身是分组密码——把128比特明文整块搅成128比特密文。但空口数据包长短不一,直接用块密码既浪费填充又引入差错传播。工程上就用计数器模式(CTR)改造:拿计数器当输入,用AES加密计数器生成一段密钥流,再拿去异或数据——分组密码摇身一变成了流密码。这个技巧也从侧面印证了:在变长包、低时延、按比特处理的世界里,流密码才是原住民。

SNOW 3G 是欧洲的接力棒,从3G时代一路用到4G,结构上保留了LFSR与有限状态机的经典组合。

ZUC 则是最有意思的一个——它的名字来自南北朝数学家祖冲之,就是把圆周率精确推算到小数点后七位的那位。由中国密码研究团队设计,2011年被国际移动通信标准采纳,成为加密与完整性算法家族的正式成员,后来也被纳入中国商用密码标准体系。对一个国家的自主密码算法来说,进入国际移动通信标准,相当于本土设计的锁芯被全球手机厂商的钥匙孔接纳。

六、拆开祖冲之算法:一排格子、一把搅拌机

ZUC的结构,浓缩了上一节说的全部设计智慧,可以画成一张三段式流水线:

flowchart TD
    K["128 位密钥"] --> L["LFSR 31 级移位寄存器"]
    V["128 位初始向量 IV"] --> L
    L -->|比特重组 BR| M["三个 32 位字 X0 X1 X2"]
    M --> F["非线性函数 F"]
    F --> N["记忆单元 R1 R2"]
    F -->|每拍一个 32 位字| O["密钥流"]
    O -->|与明文逐比特异或| C["密文"]

三段各司其职:

  1. LFSR(31级,每级31比特):负责“悠久循环”。精心挑选的反馈抽头让它产生超长周期、统计特性优良的序列。注意每级是31比特而非32比特——满打满算的32位反而会削弱序列的周期性质,这是做序列设计时反复推敲过的取舍。
  2. 比特重组(BR):从寄存器的特定位置挑出三个32位字,交给下游。它像取样器,决定“哪一勺汤”送去搅拌。
  3. 非线性函数 F:真正的“搅拌机”。它带着两个32位的记忆单元R1和R2,每一拍把输入搅出一个32位密钥流字,同时更新自己的记忆。有了记忆和S盒非线性,整个输出就不再是输入的线性函数,Berlekamp-Massey式的线性攻击就此失效。

初始化时,密钥和IV被灌进LFSR作为初始状态,先空转若干拍“热身”,之后每一拍产出一个32位字。发送多长的数据,就产多长的密钥流——密钥流即用即弃,一拍都不会重复给同一段数据用。

七、空口怎么用:五个输入,一条流水线

算法本身只回答“怎么生成密钥流”,而空口系统要回答“每一包数据,该用哪一段密钥流”。这靠的是给生成器的五个输入参数:

输入参数 作用
KEY 加密密钥,来自密钥树派生
COUNT 32位计数器,保证密钥流永不重复
BEARER 5位承载标识,不同数据流用不同密钥流
DIRECTION 1位方向标识,上行与下行密钥流分开
LENGTH 本次生成密钥流的长度

这里的核心配角是 COUNT。它由两部分拼接:低位是每个包的序列号SN,高位是超帧号HFN。每发一个包,COUNT加一,密钥流就前进一段全新的区域。设计COUNT的本质动机只有一个:确保同一密钥下,密钥流永不被两段数据重复使用。

为什么“不重复”值得专门用一个计数器来保证?因为密钥流重用是流密码的死刑判决。两段密文若用了同一段密钥流,把两段密文直接异或,密钥流当场抵消:

$$C_1 \oplus C_2 = (P_1 \oplus K) \oplus (P_2 \oplus K) = P_1 \oplus P_2$$

攻击者虽然没拿到明文,却拿到了两段明文的异或——这在密码分析上等于城门洞开,配合统计分析几乎必然还原原文。早期WiFi的WEP加密就是栽在这里:IV只有24位,几万个包之后必然重用,整网加密形同虚设,至今还是安全课上最著名的反面教材。空口把COUNT做成32位并严格管理,就是在制度上杜绝WEP式的悲剧。

下面是完整的收发流水线:

sequenceDiagram
    participant TX as 发送端 PDCP
    participant GEN as 密钥流生成器
    participant RX as 接收端 PDCP
    TX->>GEN: 输入 KEY COUNT BEARER 方向
    GEN-->>TX: 生成密钥流
    TX->>RX: 密文 = 明文 异或 密钥流
    RX->>GEN: 同样的输入 再要一份密钥流
    GEN-->>RX: 生成相同密钥流
    RX->>RX: 密文 异或 密钥流 还原明文

注意一个优雅的细节:密钥流本身从不在线路上传输。线路上的只是密文,而接收端凭相同的五个输入,能独立复现出分毫不差的密钥流。窃听者听到的一切,都只是“随机噪声”。

与加密并肩工作的还有完整性保护:用同样的机制再生成一条密钥流,对消息算出一个32位的校验码MAC,附在消息后面。接收端重算一遍,对不上就丢弃——防的是“篡改”和“重放”,与防“偷听”的加密各管一边。

八、实战连接:现场排障时你会在哪遇到它

一、算法协商在信令里明摆着。 手机入网后的安全模式命令消息里,携带着网络选定的加密与完整性算法标识。抓一份NAS或RRC信令,能看到网络在菜单里“点菜”的过程——它根据USIM卡的能力和运营商策略,在三种算法里挑一个。

二、“不加密”也是菜单上的一道菜。 加密算法标识里保留着“空算法”选项,即只做完整性保护、不做加密。它存在的现实原因包括部分物联网场景对成本功耗的极致压缩,以及个别监管环境的要求。看现网参数时看到“空加密”被启用,不要当成配置事故,先查策略意图。

三、COUNT失步是真实的故障源。 接收端必须与发送端的COUNT严格对齐,才能取到同一段密钥流。一旦失步——比如上下文重建、切换过程异常——接收端校验完整性会连续失败,此时协议设计里有“猜测HFN递增”的自愈机制。排障时如果看到完整性校验失败伴随数据中断,COUNT对齐就是重点怀疑对象。

四、加密不等于完整,完整不等于加密。 这是新手最常见的误解。理论上可以“只加密不校验”——但密文被篡改后解密会得到乱码而非报错,应用层可能毫无防备地吞下去;也可以“只校验不加密”——消息内容裸奔但没人能改。空口的设计是信令两者都必须有,数据面加密必选、完整性保护在4G缺席而5G补上了——5G把用户面完整性保护列为可选能力并交由核心网侧执行,这是两代安全设计一个容易被忽略的差异。

五、密钥更长一档的算法已经铺路。 面对“量子计算威胁现有128位密钥”的远虑,标准组织在后续版本中引入了256位密钥长度的算法族。算法结构不变,加长的是种子——又一次印证了流密码工程的核心逻辑:安全强度几乎全部押在那颗种子的不可预测性上。

九、把整条逻辑链收拢

回到开头那个快递的比喻,现在可以把三个安全动作完整串起来:

而这条链的每一环,都围绕同一个朴素信念:窃听者可以听到一切,但听到的每个比特都对他毫无意义。 从香农那本“一次一密”的完美密码本,到31级移位寄存器里循环不息的祖冲之算法,七十余年过去,密码学家做的事本质上是同一件——用一颗可以握在手里的种子,去逼近一本永远带不走的密码本。

常见问题

Q: 流密码和分组密码(如AES)的本质区别是什么? A: 分组密码一次处理固定大小的一整块(如128比特),块内位置重排搅乱;流密码按比特或按字逐个处理,密钥流像水一样连续流过数据。空口数据包长短不一、要求低时延,所以三类空口算法里两类是“真”流密码,AES也要套上计数器模式伪装成流密码再用。

Q: 为什么密钥流绝对不能重复使用,重复了会怎样? A: 同一段密钥流加密两段明文时,两段密文异或后密钥流抵消,攻击者直接得到两段明文的异或,可再用统计分析还原内容。早期WiFi的WEP协议因IV太短频繁重用密钥流而被整体攻破,是这一原理最著名的反面教材。空口用32位COUNT从机制上保证密钥流一次一换。

Q: 加密和完整性保护有什么区别?为什么两个都要? A: 加密防“偷听”——别人看不懂内容;完整性保护防“篡改”和“重放”——别人改一个比特都会被校验码抓住。只加密不校验时,被篡改的密文会解密成乱码,接收方可能毫无察觉地照单全收。所以空口信令要求两者同时启用,缺一不可。

Q: IV(初始向量)和密钥是什么关系?为什么两个都要输入算法? A: 密钥是长期稳定的“根种子”,来自认证后的密钥派生;IV是每次连接或每次演进时变化的“临时调料”。两者共同决定密钥流的起点。只换IV不换密钥,就能让同一把密钥衍生出不同的密钥流段,避免频繁做耗时的完整认证。

Q: 我在做信令分析时,怎么确认当前用的是哪种加密算法? A: 看安全模式控制消息里携带的算法标识字段:标识0为不加密,标识1对应SNOW 3G,标识2对应AES,标识3对应ZUC,5G时代只是编号前缀从E换成N。若发现现网配置为空加密,先确认这是策略意图还是配置疏漏,再决定是否处置。

参考来源

  1. ZUC (cipher) — Wikipedia — ZUC算法的设计背景、3GPP采纳时间与内部结构的权威概述
  2. SNOW — Wikipedia — SNOW 3G流密码的结构与在移动通信中的使用
  3. One-time pad — Wikipedia — 香农完美保密定理与一次一密的原始定义
  4. Linear-feedback shift register — Wikipedia — LFSR原理与m序列特性
  5. Wired Equivalent Privacy — Wikipedia — WEP因IV重用被攻破的经典案例

说明:本文写作环境中外部抓取通道受限,上述关键事实依据密码学公开教材与标准知识梳理,核心内容(ZUC的3GPP采纳、31级LFSR结构、EEA/NIA编号体系、COUNT防重用机制)均为稳定且被多来源广泛记载的通识,建议读者点击链接复核细节。


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