1) AES-128算法的输入K和一个全零的值;
2) 按如下操作分离出K1:如果L最重要位的值为0,K1就是L从左数的第一位的值;否则,K1由const_Rb
的扩展OR和L从左数的第一位的值共同得到;
3) 按如下操作分离出K2:如果K1最重要位的值为0,K2就是L从左数的第一位的值;否则,K2由const_Rb
的扩展OR和K1从左数的第一位的值共同得到; 4) 返回K1,K2值。
3.1.5.4.2 生成鉴权码MAC
生成鉴权码MAC的算法为AES-CMAC(),其输入为密钥K,消息M和消息长度len;其中M是长度为len的比特流,其构造如下: M0 .. M31 = COUNT[0] .. COUNT[31] M32 .. M36 = BEARER[0] .. BEARER[4] M37 = DIRECTION
M38 .. M63 = 026 (i.e. 26 zero bits)
M64 .. MBLENGTH+63 = MESSAGE[0] .. MESSAGE[BLENGTH-1] 因此,len = BLENGTH + 64.
MESSAGE为需要进行完整性保护的原始消息,其长度为BLENGTH。EIA2算法中,M表示成M_i序列,M_i为一个消息块。M = M_1 || M_2 || ... || M_{n-1} || M_n,i = 1,...,n-1。M_i的长度为128bits。
该算法的输出为鉴权码MAC,用于证明输入消息的正确性。MAC由T表示,T := AES-CMAC(K,M,len),通过MAC的正确性判断来验证源端消息的完整性。
It is possible to truncate the MAC. According to [NIST-CMAC], at least a 64-bit MAC should be used as protection against guessing attacks. The result of truncation should be taken in most significant bits first order.
AES-128的消息块长度为128bits。如果消息长度不等于消息块大小的整倍数,则采取特殊的处理:在最后一个消息块中加bit串10^i使其称为一个完整的消息块。
对于一个输入流x,填充函数padding(x)定义如下: - padding(x) = x || 10^i //i等于128-8*r-1 图3.1.5.4-2描述了MAC生成算法
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Algorithm AES-CMAC + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
26
+ + + Input : K ( 128-bit key ) + + : M ( message to be authenticated ) + + : len ( length of the message in octets ) + + Output : T ( message authentication code ) + + + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Constants: const_Zero is 0x00000000000000000000000000000000 + + const_Bsize is 16 + + + + Variables: K1, K2 for 128-bit subkeys + + M_i is the i-th block (i=1..ceil(len/const_Bsize)) + + M_last is the last block xor-ed with K1 or K2 + + n for number of blocks to be processed + + r for number of octets of last block + + flag for denoting if last block is complete or not +
+ + + Step 1. (K1,K2) := Generate_Subkey(K); + + Step 2. n := ceil(len/const_Bsize); + + Step 3. if n = 0 + + then + + n := 1; + + flag := false; + + else + + if len mod const_Bsize is 0 + + then flag := true; + + else flag := false; + + + + Step 4. if flag is true + + then M_last := M_n XOR K1; +
27
+ else M_last := padding(M_n) XOR K2; + + Step 5. X := const_Zero; + + Step 6. for i := 1 to n-1 do + + begin + + Y := X XOR M_i; + + X := AES-128(K,Y); + + end + + Y := M_last XOR X; + + T := AES-128(K,Y); + + Step 7. return T; +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
图3.1.5.4-2 AES-CMAC算法
1) 根据子密钥生成算法从密钥K中得到子密钥K1,K2;
2) 计算消息块个数n,取比(消息总长度除以消息块长度)大的最小整数;
3) 检查输入信息的长度,若输入的长度为0,则消息块个数为1,标识为不完整的消息块(失败);否则,
若最后一个消息块的长度为128bits,则标识为完整的消息块(成功);否则,标识为不完整的消息块(失败);
4) 根据M_n的扩展OR和一个子密钥计算M_last。如果最后一个消息块是完整的,则由M_n的扩展OR和
K1得到M_last;否则,由M_n的扩展OR和K2得到M_last; 5) 初始化变量X;
6) CBC-MAC用于得到M_1,...,M_{n-1},M_last;
7) 得到MAC,T := AES-CMAC(K,M,len)。If necessary, the MAC is truncated before it is returned.
3.1.5.4.3 验证鉴权码MAC
MAC验证可以简单的通过再计算MAC得到,应用的还是生成MAC的算法。
MAC验证函数Verify_MAC(),有四个输入参数:密钥K,消息M,消息长度len,得到的鉴权码MAC,用T’标识;输出为INVALID或VALID。
图3.1.5.4-3描述的是MAC验证算法。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Algorithm Verify_MAC +
28
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + + Input : K ( 128-bit Key ) + + : M ( message to be verified ) + + : len ( length of the message in octets ) + + : T' ( the received MAC to be verified ) + + Output : INVALID or VALID + + + +-------------------------------------------------------------------+
+ + + Step 1. T* := AES-CMAC(K,M,len); + + Step 2. if T* is equal to T' + + then + + return VALID; + + else + + return INVALID; + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
图3.1.5.4-3 Verify_MAC算法
1) 在MAC生成算法中,根据K,M和len得到T*;
2) 比较T*和T'。如果T*=T',返回VALID;否则返回INVALID;
如果输出为INVALID,则证明消息不可靠;若输出为VALID,则证明消息可靠,在传输过程中没有被干扰;尽管如此,这种确认在任何MAC算法中都不是绝对的。
3.1.6 EIA3、EEA3(ZUC)
ZUC算法(数学家祖冲之名字的缩写)是CCSA推荐给3GPP LTE使用的新算法,已在3GPP SA3立项。目前ZUC算法已通过了算法标准组ETSI SAGE的内部评估,通过了两个专业团队的外部评估,经过评估后ETSI SAGE认为算法强壮,并推荐在LTE标准中使用。这将是第一个成为国际标准的我国自主的密码算法。ZUC算法的国际标准化,对我国按照国际惯例掌握通信产业的主动有非常重要的意义。在国家密码管理局的大力支持下,DCS中心成功举办了两次国际研讨会,会议结果作为必要的公众评估结论,为算法的国际标准化奠定了基础。
ZUC算法作为我国第一个自主产权的安全算法,受到国家乃至全球的高度重视,将全面应用于我国的LTE系统中――作为设备入网的必选算法,并可能在网络部署时进行全网开启。在这种背景下,需要对LTE基站的安全技术进行系统梳理。
29
ZUC是一个面向字的流密码算法,初始密钥为128位,初始矢量为128位,输出每个密钥字为32位的密钥流(这里每个32位的密钥称为一个密钥字).该密钥流可用于对明文信息加解密。
使用ZUC算法分为两个阶段:密钥初始化阶段和产生密钥阶段.第一个阶段进行密钥初始化工作,即不输出密钥。第二阶段是产生密钥阶段,每循环一次产生一个32位的密钥字输出。 3.1.6.1 ZUC算法结构
ZUC有3个逻辑层,参见下图。顶层是16阶线性反馈移存器 (LFSR),中间层是位重组 层,底层为是非线性函数F。
3.1.6.2 线性反馈移存器LFSR
LFSR有16个31位寄存器(s0, s1,…, s15). 每个寄存器 si (0≤i≤15) 定义域为
{1,2,3, …,231-1}.
LFSR有2个操作模式: 初始化模式和工作模式。
初始化模式,LFSR接收一个31位的输入u, 其产生公式为
u=(W⊕X3)>>1.
即
LFSRWithInitialisationMode(u) {
30