A5/3 流密码算法的加密与解密过程
我们来详细讲解A5/3算法。A5/3,也称为KASUMI,是一种用于第三代(3G)移动通信系统(UMTS)中的流密码算法,主要用于无线链路的机密性保护(f8算法)和完整性保护(f9算法)。它是一种基于分组密码构造的流密码,其核心是一个修改版的MISTY1分组密码。
一、题目描述
A5/3算法的核心是一个8轮的Feistel结构分组密码,其分组长度为64位,密钥长度为128位。在UMTS中,它通常被用作一个序列生成器,通过特定的工作模式生成密钥流,对明文进行逐位异或加密。本题将详细剖析A5/3算法的内部结构,包括其轮函数、密钥调度算法,并解释其如何工作在输出反馈模式(OFB-like)下实现流加密。
二、核心结构:KASUMI分组密码
A5/3的本质是运行在特定模式下的KASUMI密码。我们先深入理解KASUMI本身。
KASUMI是一个8轮的Feistel密码。每一轮处理64位的输入,并将其分为左右两部分,各32位。设第i轮的左半部分输入为L_{i-1},右半部分为R_{i-1},轮函数为FO_i,子密钥为KL_i, KO_i, KI_i,则一轮的操作为:
L_i = R_{i-1}
R_i = L_{i-1} ⊕ FO_i(R_{i-1}, KO_i, KI_i, KL_i)
注意这里的FO_i函数是MISTY1中FO函数的简化版本,并且其内部也依赖于KL_i。这是KASUMI与MISTY1的一个区别。
三、轮函数FO详解
FO函数是一个3层的结构。它接收一个32位的输入I,以及三组轮密钥KO_i, KI_i(用于内部)和KL_i(用于外部,这是KASUMI特有的修改)。KO_i和KI_i各包含三个16位子密钥,KL_i包含两个16位子密钥。
FO函数步骤如下:
- 将32位输入
I分成两个16位部分:I = L0 || R0。 - 然后进行三层处理:
- 第1层:
R1 = FI(L0 ⊕ KO_{i,1}, KI_{i,1}) ⊕ R0;L1 = R0。 - 第2层:
R2 = FI(L1 ⊕ KO_{i,2}, KI_{i,2}) ⊕ R1;L2 = R1。 - 第3层:
R3 = FI(L2 ⊕ KO_{i,3}, KI_{i,3}) ⊕ R2;L3 = R2。
- 第1层:
- 最后,
FO函数的输出是(L3, R3),但KASUMI在此处增加了一个额外的“混合”步骤:输出FO_i(I) = (L3 ⊕ KL_{i,2}) || (R3 ⊕ KL_{i,1})。这额外的异或操作是KASUMI相对于MISTY1的主要修改,旨在增强对特定攻击的抵抗力。
四、内部函数FI详解
FI函数是KASUMI的核心非线性组件。它是一个4轮的、不平衡的Feistel结构,输入为16位,使用两个子密钥:一个16位的KI_{i,j}和一个从主密钥派生的9位KI'(这里KI_{i,j}在FI中被拆用)。
FI的处理过程(简化描述):
- 将16位输入分成不等的两部分:9位的左半部分
L和7位的右半部分R。 - 使用两个S盒:
S7(7位输入/7位输出)和S9(9位输入/9位输出)。 - 每一轮的操作大致为:新的
R= 旧的L经过S9或S7变换后,与旧的R及一个子密钥字节异或;然后交换L和R。 - 经过4轮后,输出16位结果。
S盒S7和S9是经过精心设计的,具有较好的密码学性质(如非线性度、差分均匀性等)。
五、密钥调度算法
A5/3使用128位密钥K。密钥调度算法生成8轮所需的子密钥KL_i, KO_i, KI_i。每一轮需要:
KL_i: 两个16位子密钥(KL_{i,1}, KL_{i,2})。KO_i: 三个16位子密钥(KO_{i,1}, KO_{i,2}, KO_{i,3})。KI_i: 三个16位子密钥(KI_{i,1}, KI_{i,2}, KI_{i,3})。
生成过程:
- 首先,将128位主密钥
K分成8个16位子密钥:K1, K2, ..., K8。 - 然后,定义一系列“常量”
C_i(也是16位值),这些常量是固定的,用于在生成过程中引入非对称性。 - 对于每一轮
i(从1到8),子密钥通过以下方式从K1...K8衍生出来(其中<<<表示循环左移):KL_{i,1} = K_{(i mod 8) + 1} <<< 1(如果是特定轮次,则加C_i后再移位,规则有细微不同,但核心是K的移位和与常量异或)。KL_{i,2} = K_{(i+2 mod 8) + 1}(同样可能有常量调整)。KO_{i,j}和KI_{i,j}的生成规则类似,都是对K1...K8进行不同的循环移位并与常量C_i结合产生。具体规则较为繁琐,但设计目标是确保每一轮使用的子密钥材料都是主密钥不同部分的函数,并且具有足够的差异。
这个调度算法确保了密钥的充分扩散,并且利用了循环移位和固定常量来消除对称性。
六、作为流密码(A5/3)的加密解密过程
在UMTS的机密性算法(f8)中,A5/3并不直接用于分组加密模式,而是用作密钥流生成器。
初始化:
- 输入:128位保密密钥
CK,32位计数器COUNT,5位承载标识BEARER,1位方向位DIRECTION,以及所需的密钥流长度LENGTH。 - 初始化一个64位的状态寄存器(在标准中,这是分组密码的输入块)。
- 根据
COUNT、BEARER、DIRECTION等参数,按照特定规则构造一个64位的初始向量IV(也称为BLOCK)。构造公式为:IV[0..31] = COUNT[0..31],IV[32..36] = BEARER,IV[37] = DIRECTION, 其余位(IV[38..63])填充0。然后对这个IV进行一个特定的比特重排。 - 密钥流生成的核心操作是:
KSB = KASUMI(IV ⊕ A) ⊕ B,其中A和B是由CK派生的、用于特定阶段的掩码值(在f8算法中定义,通常是通过KASUMI加密一些常量生成)。但最简化的理解模型是:A5/3运行在一个类似输出反馈(OFB)的模式下。
密钥流生成与加解密(简化流程):
- 状态
S初始化为IV。 - 对于每一块(64位)密钥流,计算:
KeyStreamBlock = KASUMI_CK(S),其中KASUMI_CK表示以CK为密钥的KASUMI加密。 - 然后更新状态
S:通常是S = KeyStreamBlock(OFB模式)或S = S + 1(计数器模式变种,实际f8算法更复杂,涉及掩码和加法)。在UMTS f8中,状态更新规则是S = (S + 1) mod 2^64,但S在每次加密前会与一个掩码异或。 - 将生成的
KeyStreamBlock与相同长度的明文块进行逐比特异或,得到密文块。解密过程完全相同:将相同的密钥流与密文块异或,即可恢复明文。
解密:由于流密码是对称操作,解密过程与加密过程完全一致。在接收端,使用相同的密钥CK、相同的COUNT、BEARER、DIRECTION等参数,按照相同的步骤生成完全相同的密钥流序列。然后将密钥流与接收到的密文序列逐比特异或,即可还原出原始明文。
七、总结
A5/3(KASUMI)算法是一个设计精巧的密码:
- 其核心是一个修改自MISTY1的8轮Feistel分组密码,通过引入额外的密钥混合(
KL_i在FO输出处)增强了安全性。 - 它使用了不平衡的Feistel结构
FI和非线性S盒S7/S9来提供混淆和扩散。 - 其密钥调度算法利用循环移位和固定常量,从128位主密钥生成8轮、每轮8个子密钥的丰富密钥材料。
- 在实际3G通信中,它被实例化为一个密钥流生成器,通过精心设计的初始化过程(结合计数器、承载标识等)和状态更新规则,确保每次会话的密钥流都是唯一的,从而实现安全的流加密。
虽然A5/3的设计旨在抵抗当时的已知攻击,并且经过了多年的公开评估,但后来的研究也发现了一些理论上的弱点。不过,在3G标准中,它与其他安全机制一起,为当时的无线通信提供了足够的保护。其设计思想,特别是如何将一个强壮的分组密码适配为流密码工作模式,仍然是密码工程中的一个经典范例。