RSS订阅信息安全技术跟踪与研究:技术、平台、会议、论文、产业
你现在的位置:首页 / 技术积累 / 正文

3GPP规范:128-EEA3 和 128-EIA3 算法

0 技术积累 | 2014年12月23日
转载申明:本站原创,欢迎转载。但转载时请保留原文地址。
原文地址:http://www.vonwei.com/post/3gppspec1.html

1. 基本介绍

LTE系统中使用标准的机密性(confidentiality)和完整性(integrity)保护算法来构建安全体系。之前已经发布的标准算法有两组:128-EEA1/128-EIA1 和 128-EEA2/128-EIA2。本文主要提出基于祖冲之ZUC算法的128-EEA3/128-EIA3标准。
128-EEA3是机密性保护算法,一个流加密系统,使用机密性密钥CK来加解密数据块。数据块的大小可能位于1比特到65504比特之间。该算法使用ZUC作为一个密钥流生成器(keystream generator)。
128-EIA3是完整性保护算法,使用一个完整性密钥IK对给定的输入消息计算出一个32位的MAC值。MAC核心算法是一个通用的哈希和ZUC。

相关变量和记号:
a||b: 级联;
⌈x⌉:不小于x的最小整数;
⊕:异或;
a<<t:将a左移t比特
COUNT:32位计数器
BEARER:5位bearer身份信息
DIRECTION:1位输入,指定传输的方向
CK:128位机密性密钥
IK:128位完整性密钥
LENGTH:待加密或者待解密的比特数
M:输入消息
C:输出消息
KEY:ZUC的128位初始密钥
IV:ZUC的128位初始向量
L:ZUC生成的key words的个数 (1 word = 4 bytes = 32 bits)
z[i]:ZUC生成的密钥流的第i个密钥比特

2. 128-EEA3机密性算法

输入:
参数          规模(比特数)      说明
COUNT          32                 计数器
BEARER          5                The bearer identity
DIRECTION     1              传输方向
CK                  128           机密性密钥
LENGTH         32            输入消息的长度
M              LENGTH        输入比特流

输出:
参数          规模(比特数)     说明
C                 LENGTH         输出比特流

初始化:
在密钥流生成之前,使用输入(CK和一些初始变量)对ZUC的参数(KEY和IV)进行初始化。
 CK的字节表示:CK = CK[0]||CK[1]||CK[2]||…||CK[15] (128位CK分为16个字节,16*8=128);
 ZUC初始密钥KEY的字节表示:KEY = KEY[0]||KEY[1]||…||KEY[15];
 设置KEY:KEY[i] = CK[i], i=0,1,2,…,15;
 32位计数器COUNT = COUNT[0] || COUNT[1] || COUNT[2] || COUNT[3];
 ZUC初始向量IV的字节表示:IV = IV[0] || IV[1] ||…|| IV[15];
 设置IV如下:
  IV[0] = COUNT[0], IV[1] = COUNT[1],
IV[2] = COUNT[2], IV[3] = COUNT[3],
IV[4] = BEARER || DIRECTION || 002,
IV[5] = IV[6] = IV[7] = 000000002,
IV[8] = IV[0], IV[9] = IV[1],
IV[10] = IV[2], IV[11] = IV[3],
IV[12] = IV[4], IV[13] = IV[5],
IV[14] = IV[6], IV[15] = IV[7].
说明:即使用输入的机密性密钥作为ZUC的初始密钥,使用输入的COUNT、BEARER、DIRECTION信息来设置ZUC的初始向量。

密钥流生成:
 使用ZUC算法产生L words长度的密钥流,即相当于32L位(bits),得到一个二进制字符串z[0], z[1], …, z[32L-1], 其中在z[0]是输出第一个字(word)的最高有效位,而z[31]是输出第一个字的最低有效位,总共输出L个字。
 为了加密一个LENGTH位的消息,需要L满足L=⌈LENGTH/32⌉

加解密:
 加密操作和解密操作一样,都使用生成的密钥流z和输入消息M进行按位异或操作。
 设输入消息的比特流表示:M = M[0] || M[1] || M[2] || … || M[LENGTH-1];
 设输出消息的比特流表示:C = C[0] || C[1] || C[2] || … || C[LENGTH-1];
 对i=0,1,2,….,LENGTH-1,进行如下异或操作:(按位异或)
  C[i] = M[i] ⊕ z[i], i=0,1,2,…,LENGTH-1

C语言实现:

typedef unsigned char u8;
typedef unsigned int u32;
/* The ZUC algorithm, see ref. [3]*/
void ZUC(u8* k, u8* iv, u32* ks, int len)
{
/* The initialization of ZUC, see page 17 of ref. [3]*/
Initialization(k, iv);
/* The procedure of generating keystream of ZUC, see page 18 of ref. [3]*/
GenerateKeystream(ks, len);
}
void EEA3(u8* CK,u32 COUNT,u32 BEARER,u32 DIRECTION,u32 LENGTH,u32* M,u32* C)
{
u32 *z, L, i;
u8 IV[16];
L = (LENGTH+31)/32;
z = (u32 *) malloc(L*sizeof(u32));
IV[0] = (COUNT>>24) & 0xFF;
IV[1] = (COUNT>>16) & 0xFF;
IV[2] = (COUNT>>8) & 0xFF;
IV[3] = COUNT & 0xFF;
IV[4] = ((BEARER << 3) | ((DIRECTION&1)<<2)) & 0xFC;
IV[5] = 0;
IV[6] = 0;
IV[7] = 0;
IV[8] = IV[0];
IV[9] = IV[1];
IV[10] = IV[2];
IV[11] = IV[3];
IV[12] = IV[4];
IV[13] = IV[5];
IV[14] = IV[6];
IV[15] = IV[7];
ZUC(CK,IV,z,L);
for (i=0; i<L; i++)
{
C[i] = M[i] ^ z[i];
}
free(z);
}

3. 128-EIA3完整性算法
输入:
参数           规模(比特数)            说明
COUNT              32                      计数器
BEARER              5                The bearer identity
DIRECTION        1                        传输方向
IK                      128                 完整性密钥
LENGTH            32               输入消息的长度
M                 LENGTH                   输入消息

输出:
参数 规模(比特数) 说明
MAC 32 32位MAC值

初始化:
 在生成密钥流之前,使用输入(IK和相关变量)对ZUC的参数(KEY和IV)进行初始化。
 设128位IK = IK[0] || IK [1] || … || IK[15] (字节表示);
 对于128位ZUC初始密钥KEY = KEY[0] || KEY[1] || … || KEY[15],设置
   KEY[i] = IK[i], i=0,1,2,…,15
 设32位计数器COUNT = COUNT[0] || COUNT[1] || COUNT[2] || COUNT[3];
 对于128位ZUC初始向量IV = IV[0] || IV[1] || … || IV[15],设置如下:
IV[0] = COUNT[0], IV[1] = COUNT[1],
IV[2] = COUNT[2], IV[3] = COUNT[3],
IV[4] = BEARER || 0002, IV[5] =000000002,
IV[6] = 000000002, IV[7] = 000000002,
IV[8] = IV[0]⊕(DIRECTION << 7), IV[9] = IV[1],
IV[10] = IV[2], IV[11] = IV[3],
IV[12] = IV[4], IV[13] = IV[5],
IV[14] = IV[6]⊕(DIRECTION << 7), IV[15] = IV[7].

密钥流生成:
 使用ZUC算法产生L=⌈LENGTH/32⌉+2 字(words)的密钥流,其比特串的形式为z[0], z[1], …, z[32L-1]。
 对每个i=0,1,2,…,32(L-1), 设置:
  zi = z[i] || z[i+1] || … || z[i+31]
 那么生成的每个zi是一个32位的字。

MAC计算:
 设T是一个32位的字,且设T = 0;
 对于每个i=0,1,2,…,LENGTH-1,如果M[i]=1, 那么T=T⊕zi;
 设T=T⊕zLENGTH;
 最后使用T=T⊕z32(L-1)作为输出的MAC值。

C语言实现:

typedef unsigned char u8;
typedef unsigned int u32;
void ZUC(u8* k, u8* iv, u32* keystream, int length); /*see Annex 1*/
u32 GET_WORD(u32 * DATA, u32 i)
{
u32 WORD, ti;
ti = i % 32;
if (ti == 0) {
WORD = DATA[i/32];
}
else {
WORD = (DATA[i/32]<<ti) | (DATA[i/32+1]>>(32-ti));
}
return WORD;
}
u8 GET_BIT(u32 * DATA, u32 i)
{
return (DATA[i/32] & (1<<(31-(i%32)))) ? 1 : 0;
}
void EIA3(u8* IK,u32 COUNT,u32 DIRECTION,u32 BEARER,u32 LENGTH,u32* M,u32* MAC)
{
u32 *z, N, L, T, i;
u8 IV[16];
IV[0] = (COUNT>>24) & 0xFF;
IV[1] = (COUNT>>16) & 0xFF;
IV[2] = (COUNT>>8) & 0xFF;
IV[3] = COUNT & 0xFF;
IV[4] = (BEARER << 3) & 0xF8;
IV[5] = IV[6] = IV[7] = 0;
IV[8] = ((COUNT>>24) & 0xFF) ^ ((DIRECTION&1)<<7);
IV[9] = (COUNT>>16) & 0xFF;
IV[10] = (COUNT>>8) & 0xFF;
IV[11] = COUNT & 0xFF;
IV[12] = IV[4];
IV[13] = IV[5];
IV[14] = IV[6] ^ ((DIRECTION&1)<<7);
IV[15] = IV[7];
N = LENGTH + 64;
L = (N + 31) / 32;
z = (u32 *) malloc(L*sizeof(u32));
ZUC(IK, IV, z, L);
T = 0;
for (i=0; i<LENGTH; i++) {
if (GET_BIT(M,i)) {
T ^= GET_WORD(z,i);
}
}
T ^= GET_WORD(z,LENGTH);
*MAC = T ^ z[L-1];
free(z);
}

参考:Specification of the 3GPP Confidentiality and Integrity Algorithms 128-EEA3 & 128-EIA3. Document 1: 128-EEA3 and 128-EIA3 specifications.


  • ------------------分隔线----------------

  • 如果感兴趣,欢迎关注本站微信号,跟踪最新博文信息,手机微信扫一扫下面的二维码,即可关注!
  • 微月信公众号
  • 推荐您阅读更多有关于“ ZUC算法   ”的文章

    请填写你的在线分享代码
    上一篇:Should I Remove It: Windows安全软件下一篇:Bit9安全平台简介

    猜你喜欢

    评论列表:

    发表评论

    必填

    选填

    选填

    必填,不填不让过哦,嘻嘻。

    记住我,下次回复时不用重新输入个人信息

    本站介绍
    最近发表
    本年最热文章
    本月最热文章
    网站分类
    文章归档