LTE-Security加密保护算法_第1页
LTE-Security加密保护算法_第2页
LTE-Security加密保护算法_第3页
LTE-Security加密保护算法_第4页
LTE-Security加密保护算法_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.z.LTE安全功能目录TOC\o"1-3"\h\z1概述错误!未找到引用源。)consumingF(LFSR运行初始化模式,32比特F作为输入,也是输出)生成密钥流ss11s5s2s1s0s15-1⊞R1R3R2⊞ztS2S1FSM图.4-2生成密钥流流程如图所示生成密钥流流程:首先,FSMclock一次,丢弃FSM输出字;然后LFSR在密钥流模式clock一次。在生成32-bit字的密钥流时,执行5次以下步骤,生成5个32比特的密钥流:步骤1:FSMclock,产生一个32-bit输出字F;步骤2:计算下一个密钥流字:zt=Fs0;步骤3:LFSR在密钥流模式下clock。计算得到鉴权码MAC根据Eval_M函数计算:EVAL=0;For(i=0;i<=D-2;i++){ EVAL=MUL(EVALMi,P,0*0001b);}EVAL=EVALMD-1;EVAL=Mul(EVAL,Q,0*0001b);For(i=0;i<=31;i++){MAC-I[i]=eiOTP[i];}根据得到的鉴权码MAC-I,判断消息的完整性。128-EIA2EIA2算法原理128-EIA2基于CMAC模式的128-bitAES算法。MESSAGE的比特长度称为BLENGTH。CMAC模式的输入是Mlen长度的字符串M。M由以下几部分组成:M0..M31=COUNT[0]..COUNT[31]M32..M36=BEARER[0]..BEARER[4]M37=DIRECTIONM38..M63=026(i.e.26zerobits)M64..MBLENGTH+63=MESSAGE[0]..MESSAGE[BLENGTH-1]于是,Mlen=BLENGTH+64.CMAC模式的AES算法使用上述输入产生消息鉴权码T(MACT),长度Tlen=32。T用作128-EIA2算法的输出MACT[0]..MACT[31],MACT[0]是T的MSB。输入和输出voidAES_CMAC(constunsignedchar*key,unsignedintcount,unsignedcharbearer,unsignedchardir,constunsignedchar*input,unsignedshortlength,unsignedchar*mac)输入参数和输出参数见下表。表.2-1输入参数参数大小(bits)注释KEY128密钥MESSAGELENGTH由需要鉴权的消息、COUNT值、BEARER值和DIRECTION构造出的数据LENGTHvariable>=0消息长度(按8位字节计算)表.2-2输出参数参数大小(bits)注释MAC128消息鉴权码EIA2算法流程图图.3-1EIA2完整性保护算法流程如图.3-1所示,完整性保护算法EIA2的流程有以下步骤:从RRC层获得输入参数KEY、MESSAGE和LENGTH;根据输入参数KEY计算得到子密钥:K1,K2;利用子密钥对MESSAGE加密,生成鉴权码MAC;验证鉴权码。注释:以上两种算法中的密钥KEY即KRRCint,该密钥从密钥KeNB中获得;而KeNB又是基于上层提供的密钥KASME。KASME存储在UE和MME中,并在下一个鉴权过程中更新。EIA2算法解析产生子密钥产生子密钥的算法为Generate_Subkey(),其输入为密钥K,输出为两个子密钥K1,K2,如图4.3所示。K1,K2同时应用于鉴权码MAC的生成和验证算法中。K1用于最后一个block长度等于整块长度的情况;K2适用于最后一个block长度小于整块长度的情况。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AlgorithmGenerate_Subkey+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Input:K(128-bitkey)++Output:K1(128-bitfirstsubkey)++K2(128-bitsecondsubkey)++++++Constants:const_Zerois0*0000++const_Rbis0*0087++Variables:LforoutputofAES-128appliedto0^128++++Step1.L:=AES-128(K,const_Zero);++Step2.ifMSB(L)isequalto0++thenK1:=L<<1;++elseK1:=(L<<1)*ORconst_Rb;++Step3.ifMSB(K1)isequalto0++thenK2:=K1<<1;++elseK2:=(K1<<1)*ORconst_Rb;++Step4.returnK1,K2;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++图.4-1Generate_Subkey算法AES-128算法的输入K和一个全零的值;按如下操作分离出K1:如果L最重要位的值为0,K1就是L从左数的第一位的值;否则,K1由const_Rb的扩展OR和L从左数的第一位的值共同得到;按如下操作分离出K2:如果K1最重要位的值为0,K2就是L从左数的第一位的值;否则,K2由const_Rb的扩展OR和K1从左数的第一位的值共同得到;返回K1,K2值。生成鉴权码MAC生成鉴权码MAC的算法为AES-CMAC(),其输入为密钥K,消息M和消息长度len;其中M是长度为len的比特流,其构造如下:M0..M31=COUNT[0]..COUNT[31]M32..M36=BEARER[0]..BEARER[4]M37=DIRECTIONM38..M63=026(i.e.26zerobits)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的正确性判断来验证源端消息的完整性。ItispossibletotruncatetheMAC.Accordingto[NIST-CMAC],atleasta64-bitMACshouldbeusedasprotectionagainstguessingattacks.Theresultoftruncationshouldbetakeninmostsignificantbitsfirstorder.AES-128的消息块长度为128bits。如果消息长度不等于消息块大小的整倍数,则采取特殊的处理:在最后一个消息块中加bit串10^i使其称为一个完整的消息块。对于一个输入流*,填充函数padding(*)定义如下:-padding(*)=*||10^i//i等于128-8*r-1图.4-2描述了MAC生成算法++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AlgorithmAES-CMAC+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Input:K(128-bitkey)++:M(messagetobeauthenticated)++:len(lengthofthemessageinoctets)++Output:T(messageauthenticationcode)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Constants:const_Zerois0*0000++const_Bsizeis16++++Variables:K1,K2for128-bitsubkeys++M_iisthei-thblock(i=1..ceil(len/const_Bsize))++M_lastisthelastblock*or-edwithK1orK2++nfornumberofblockstobeprocessed++rfornumberofoctetsoflastblock++flagfordenotingiflastblockispleteornot++++Step1.(K1,K2):=Generate_Subkey(K);++Step2.n:=ceil(len/const_Bsize);++Step3.ifn=0++then++n:=1;++flag:=false;++else++iflenmodconst_Bsizeis0++thenflag:=true;++elseflag:=false;++++Step4.ifflagistrue++thenM_last:=M_n*ORK1;++elseM_last:=padding(M_n)*ORK2;++Step5.*:=const_Zero;++Step6.fori:=1ton-1do++begin++Y:=**ORM_i;++*:=AES-128(K,Y);++end++Y:=M_last*OR*;++T:=AES-128(K,Y);++Step7.returnT;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++图.4-2AES-CMAC算法根据子密钥生成算法从密钥K中得到子密钥K1,K2;计算消息块个数n,取比(消息总长度除以消息块长度)大的最小整数;检查输入信息的长度,若输入的长度为0,则消息块个数为1,标识为不完整的消息块(失败);否则,若最后一个消息块的长度为128bits,则标识为完整的消息块(成功);否则,标识为不完整的消息块(失败);根据M_n的扩展OR和一个子密钥计算M_last。如果最后一个消息块是完整的,则由M_n的扩展OR和K1得到M_last;否则,由M_n的扩展OR和K2得到M_last;初始化变量*;CBC-MAC用于得到M_1,...,M_{n-1},M_last;得到MAC,T:=AES-CMAC(K,M,len)。Ifnecessary,theMACistruncatedbeforeitisreturned.验证鉴权码MACMAC验证可以简单的通过再计算MAC得到,应用的还是生成MAC的算法。MAC验证函数Verify_MAC(),有四个输入参数:密钥K,消息M,消息长度len,得到的鉴权码MAC,用T’标识;输出为INVALID或VALID。图.4-3描述的是MAC验证算法。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AlgorithmVerify_MAC+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Input:K(128-bitKey)++:M(messagetobeverified)++:len(lengthofthemessageinoctets)++:T'(thereceivedMACtobeverified)++Output:INVALIDorVALID++++++++Step1.T*:=AES-CMAC(K,M,len);++Step2.ifT*isequaltoT'++then++returnVALID;++else++returnINVALID;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++图.4-3Verify_MAC算法在MAC生成算法中,根据K,M和len得到T*;比较T*和T'。如果T*=T',返回VALID;否则返回INVALID;如果输出为INVALID,则证明消息不可靠;若输出为VALID,则证明消息可靠,在传输过程中没有被干扰;尽管如此,这种确认在任何MAC算法中都不是绝对的。EIA3、EEA3(ZUC)ZUC算法(数学家祖冲之名字的缩写)是CCSA推荐给3GPPLTE使用的新算法,已在3GPPSA3立项。目前ZUC算法已通过了算法标准组ETSISAGE的部评估,通过了两个专业团队的外部评估,经过评估后ETSISAGE认为算法强壮,并推荐在LTE标准中使用。这将是第一个成为国际标准的我国自主的密码算法。ZUC算法的国际标准化,对我国按照国际惯例掌握通信产业的主动有非常重要的意义。在国家密码管理局的大力支持下,DCS中心成功举办了两次国际研讨会,会议结果作为必要的公众评估结论,为算法的国际标准化奠定了基础。ZUC算法作为我国第一个自主产权的安全算法,受到国家乃至全球的高度重视,将全面应用于我国的LTE系统中――作为设备入网的必选算法,并可能在网络部署时进行全网开启。在这种背景下,需要对LTE基站的安全技术进行系统梳理。ZUC是一个面向字的流密码算法,初始密钥为128位,初始矢量为128位,输出每个密钥字为32位的密钥流(这里每个32位的密钥称为一个密钥字).该密钥流可用于对明文信息加解密。使用ZUC算法分为两个阶段:密钥初始化阶段和产生密钥阶段.第一个阶段进行密钥初始化工作,即不输出密钥。第二阶段是产生密钥阶段,每循环一次产生一个32位的密钥字输出。ZUC算法结构ZUC有3个逻辑层,参见下图。顶层是16阶线性反馈移存器(LFSR),中间层是位重组层,底层为是非线性函数F。线性反馈移存器LFSRLFSR有16个31位寄存器(s0,s1,…,s15).每个寄存器si(0≤i≤15)定义域为{1,2,3,…,231-1}.LFSR有2个操作模式:初始化模式和工作模式。初始化模式,LFSR接收一个31位的输入u,其产生公式为u=(W⊕*3)>>1.即LFSRWithInitialisationMode(u)

{1. v=【215s15+217s13+221s10+220s4+(1+28)s0】mod(231-1);2. Ifv=0,thensetv=231-1;3. s16=v⊕u;4. Ifs16=0,thensets16=231-1;5. (s1,s2,…,s15,s16)→(s0,s1,…,s14,s15).}在工作模式LFSR不接收输入,逐位执行右移操作。LFSRWithWorkMode()

{1. s16=215s15+217s13+221s10+220s4+(1+28)s0mod(231-1);2. Ifs16=0,thensets16=231-1;3. (s1,s2,…,s15,s16)→(s0,s1,…,s14,s15).}注1:2i与31比特数相乘可表示为向左循环移位i位,只是在上述功能的第1步中,增加模(231-1)的操作。因此LFSRWithInitialisationMode(u)函数中的第1步也可如下实现:v=(s15<<<3115)+(s13<<<3117)+(s10<<<3121)+(s4<<<3120)+s0mod(231-1).同样,LFSRWithWorkMode()中的step1也可依此实现。注2:对于GF(231-1)的两参数a、b,v=a+bmod(231-1)可通过几步实现:(1)计算v=a+b,(2)如果进位是1,令v=v+1。也可以:(1)计算w=a+b,w是32比特的值,(2)令v=(w的低31比特)+(w的最高有效位)。比特重组BR该层将LFSR产生的128位重组为4个32位的字做为F的输入。设s0,s2,s5,s7,s9,s11,s14,s15是LFSR的8个寄存器,重组后的4个32位字*0,*1,*2,*3产生方法如下:Bitreorganization()

{1. *0=s15H||s14L;2. *1=s11L||s9H;3. *2=s7L||s5H;4. *3=s2L||s0H.}非线性函数F工作过程F有2个32位的存储单元R1和R2.输入为*0,*1和*2,F输出一个32位字W.过程如下:F(*0,*1,*2)

{1. W=(*0⊕R1)⊞R2;2. W1=R1⊞*1;3. W2=R2⊕*2;4. R1=S(L1(W1L||W2H));5. R2=S(L2(W2L||W1H)).}上面S是32×32的S盒,L1和L2是线性转换.S盒一个32×32S盒由4个并列的8×8S盒组成,即S=(S0,S1,S2,S3),并且S0=S2,S1=S3.S0、S1定义分别参见表2.表.4-1S0(S2)盒定义0123456789ABCDEF03E725B47CAE0003304D1549809B96DCB17B1BF932AF9D6AA5B82DFC1D0853039024D4E8499E4CED991DDB685488B296EAC3CDC1F81E734369C6B5BDFD396320D4384767DB2A7CFED57C5F32CBB142106559B5E3EF5E314F7F5AA40D8251495FBA581C64A16D517A892241F8CFFD8AE2E01D3AD73B4BDA46EBC9DE9A8F87D73A806F2FC88B1B437F70A2213287CCC3C89C7C39656907BF7EF00B2B975235417961A64C10FEABC2695888AB0A3FBC01894F2E1E5E95DBD0DC1166645CEC59427512F5749CAA23C0E86ABBE2A02E767E644A26CC2939FF1DF6FA36D250689E6271153DD640C4E20FE8E83776B25053F0C30EA70B7A1E8A965F8D271ADB81B3A0F4457A19DFEE783460表.4-2S1(S3)盒定义0123456789ABCDEF055C263713BC847869F3CDA5B29AAFD7718CC5940CA61A1300E3A8167240F9F84224426689681D9453E1076C6A78B3943E133AB5562AC06DB3052266BFDC0BFA62484DD20110636C9C1CFF62752BB69F5D48757F844CD29C57A4BC4F9ADFFED68D7AEB62B53D85CA11417FB23D57D30677308097EEB7703F61B2198E4EE54B938F5DDBA98ADF1AE2ECB0DFCF42D466E1D97E8D1E994D37A5755E839EAB829DB91CE0CD4989A01B6BD5824A25F387899159050B895E4BD091C7CEED0FB46FA0CCF0024A79C3DECA3EFEA51E66B18EC1B2C80F774E7FF21D5A6A541E41319235C433070ABA7E0E34E88B1987CF33D606C7BCAD31F32650428F64BE859B2F598AD7B025ACAF1203E2F2如果*是8位输入到S0(或S1),并且*=h||l.则S0(或S1)表第h行第l列的数据就是输出。【例子】S0(0*12)=0*F9andS1(0*34)=0*C0.如果*是32位的输入,输出Y也是32位:*=*0||*1||*2||*3,Y=y0||y1||y2||y3,这里*i和yi是所有的字节,i=0,1,2,3.则yi=Si(*i),i=0,1,2,3.【例子】设输入*=0*12345678,输出Y为:Y=S(*)=S0(0*12)||S1(0*34)||S2(0*56)||S3(0*78)=0*F9C05A线性转换L1和L2定义为:L1(*)=*⊕(*<<<2)⊕(*<<<10)⊕(*<<<18)⊕(*<<<24),L2(*)=*⊕(*<<<8)⊕(*<<<14)⊕(*<<<22)⊕(*<<<30).ZUC两个阶段初始化阶段初始化阶段将128位初始密钥k和128位初始矢量iv输入LFSR进入初始状态设置R1和R2为0.然后执行如下过程1.Bitreorganization();2.u=F(*0,*1,*2)⊕*3;3.LFSRWithInitialisationMode(u>>1).密钥流产生阶段首先执行下面操作一次,丢弃F的输出W:1.Bitreorganization();2.F(*0,*1,*2);3.LFSRWithWorkMode()然后产生密钥流,即每执行一次,产生一个32位的Z:1.Bitreorganization();2.Z=F(*0,*1,*2)⊕*3;3.LFSRWithWorkMode()EIA3算法实现输入输出voidEIA3(u8*IK,u32COUNT,u32DIRECTION,u32BEARER,u32LENGTH,u32*M,u32*MAC)输入参数:参数长度(bits)说明COUNT32计数COUNT[0]…COUNT[31]BEARER5承载标识DIRECTION1方向DIRECTION[0]IK128完整性保护密钥IK[0]…IK[127]LENGTH32数据流长度MLENGTH输入数据流输出参数:参数长度(bits)说明MAC32产生的验证码初始化下面介绍ZUC参数如何定义:初始密钥KEY和初始向量IV是根据完整性保护密钥IK和初始变量产生的。IK是128比特完整性密钥,其中IK[i]

(0≤i≤15)是一个字节。IK=IK[0]

║IK[1]║IK[2]║…║IK[15]用于ZUC算法的128比特初始密钥KEY如下,其中KEYKEY[i]=IK[i],

i=0,1,2,…,15.

COUNT是32位计数,其中COUNT[i]

(

0≤i≤3)是一个字节。COUNT=COUNT[0]║COUNT[1]║COUNT[2]║COUNT[3]

128比特初始向量IV为:IV

=

IV[0]║IV[1]║IV[2]║…║IV[15],其中,IV[i]

(

0≤i≤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

个字的密钥流。记作:z[0],

z[1],

…,

z[32×L-1]。其中,z[0]是ZUC输出的第一个字的最高有效位,z[31]是最低有效位。对于i=0,1,2,…,32×(L–1),zi

=

z[i]║z[i+1]║…║z[i+31],Zi表示一个32位字。计算MACT是一个32位的字,令T=0。对于i=0,1,2,…,LENGTH-1,如果M[i]=1,则:T=TZi。令T=TZLENGTH。最终,得到MAC,如下:MAC=

TZ32×(L-1)。EEA3算法实现加密算法128-EEA3是一种使用密钥对数据块进行加密/解密的流加密算法。数据块的长度可以从1到65504比特。输入输出voidEEA3(u8*CK,u32COUNT,u32BEARER,u32DIRECTION,u32LENGTH,u32*M,u32*C)输入参数:参数长度(bits)说明COUNT32COUNT[0]…COUNT[31]本次帧号BEARER5BEARER[0]…BEARER[4]承载号,rbId-1DIRECTION1DIRECTION[0]方向CK128CK[0]….CK[127]加密密钥LENGTH32需要加密的数据块长度,比特MLENGTH输入明文输出参数:参数长度(bits)说明CLENGTH输出密文初始化下面介绍ZUC参数如何定义:初始密钥KEY和初始向量IV是根据加密密钥CK和初始变量产生的。CK是128比特加密密钥,其中CK[i]

(0≤i≤15)是一个字节。CK=CK[0]

║CK[1]║CK[2]║…║CK[15]设置128比特初始密钥KEY为:KEY[i]=CK[i],

i=0,1,2,…,15.

COUNT是32位计数,其中COUNT[i]

(

0≤i≤3)是一个字节。COUNT=COUNT[0]║COUNT[1]║COUNT[2]║COUNT[3]

128比特初始向量IV为:IV

=

IV[0]║IV[1]║IV[2]║…║IV[15],其中,IV[i]

(

0≤i≤15)

是字节。且: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算法生成L个字的密钥流。其中,每个字可展开为32比特,即得到二进制字符串z[0],

z[1],

…,

z[32×L‐1]。其中,z[0]是ZUC输出的第一个字的最高有效位,z[31]是最低有效位。对LENGTH比特的消息进行加密时,L=LENGTH/32。加密/解密加密和解密操作一样,都是对输入数据流M和产生的密钥流Z进行异或操作。M是输入比特流,长度为LENGTH,可表示为:M

=

M[0]║M[1]║M[2]║…║M[LENGTH‐1]C是输出比特流,长度为LENGTH,其中M[i]和C[i]均为比特,i=0,1,2,…,LENGTH‐1。C

=

C[0]║C[1]║C[2]║…║C[LENGTH‐1]

C[i]

=

M[i]z[i],其中:i=0,1,2,…,LENGTH‐1。算法选择初始安全上下文建立过程E-NodeB支持的安全算法是网络通过网络管理进行配置的,包括:一个完整性算法列表和一个加密算法列表。列表中的算法根据运营商的策略进行优先级排序。AS安全上下文建立之后,MME向eNB发送UE的EPS安全能力,随后,eNB储存UE的安全能力信息。同时,eNB根据UE的安全能力和自己本地配置的算法优先级,选择在本地配置的UE支持的优先级最高的算法,通过ASSMC消息通知UE。*2切换过程中算法选择*2切换过程中在HandoverRequest消息中需要将UEEPS安全能力和加密完整性保护算法(透明盒中含有源侧使用的算法)传给目标eNB。随后,目标eNB根据UE的安全能力和自己本地配置的算法优先级,选择在本地配置的UE支持的优先级最高的算法。而后,在HandoverRequestResponse消息过透传盒传给源eNB,源eNB发起RRC重配置消息将透传盒通知给UE。[注]:切换请求过程中携带选择的加密算法和完整性保护算法,用于目标eNB解密RRC重建完成消息。比如:在切换失败的情况下,如果UE向目标eNB侧小区发送RRC重建请求消息,目标eNB侧小区要根据源小区的算法UE发送SRB1:RRC重建完成消息进行解密和完整性保护。S1切换过程中的算法选择当进行S1切换时,MME将UE的安全能力信息通过HANDOVERREQUEST消息通知给目标eNB。目标eNB根据UE的安全能力和本地配置的算法优先级,选择UE的安全算法,并通过HANDOVERPREPARETIONACKNOWLEDGE消息告知源eNB,再通过源eNB的RRC连接重配置通知给UE。密钥的生成和更新HMAC-SHA256()算法HMAC-SHA256()算法主要应用于密钥产生函数。密钥产生过程包括两步,第一步为S的生成,第二步为HMAC过程,使用HMAC-SHA256()算法进行密钥生成。输入输出输入参数:参数长度(bits)说明Key256bit主密钥S变长输入参数,详见.1节描述输出参数:参数长度(bits)说明输出密钥256bit作为输出密钥,供相关加密/完整性保护算法使用S的生成S的生成过程如下:输入参数:Pi输入参数的编码(字节长度由Li指示)Li输入参数Pi的字节长度的编码(Li长度为2字节)FC算法标识码(长度为1字节)各种场景下FC/P0...Pn/L0...Ln的取值见4.2节。输出参数:S(长度为1+(P0的长度+2)+(P2长度+2)+…+(Pn长度+2))输入参数和长度成S,方法如下:整数j输入KDF编码为

Pi:将

j用二进制编码表示;设n是比特数,为8的倍数,或者与编码后的j一致;最低位=

j的二进制;如果j

中比特数目小于n,余下填0。【例1】如Pi是

UplinkNASCOUNT,则Pi中字节数k=4,位长度n=32.假设UplinkNASCOUNT值

j=259.用2进制编码259是100000011,

则Pi为:000000000000000000000100000011,即0*000*000*010*03Li为000000000000100,即0*000*04。【例2】Pi,

j=259将编码为Pi。则259用二进制表示为100000011,

n表示Pi的比特

16,Pi中字节数为2。Pi:0000000100000011,或者0*010*03。Li:000000000000010,即0*000*02。2. S是n+1输入参数的:S=FC||P0||L0||P1||L1||P2||L2||P3||L3||...||Pn||LnHMAC过程下图为HMAC过程的实现框图。HMAC-SHA256算法框图步骤:第一步、填充缓冲区:ipad=thebyte0*36repeatedBtimesopad=thebyte0*5CrepeatedBtimes.第二步、计算数据为te*t的HMAC码字:如果密钥长度大于64字节,首先进行哈希变换,以认证码字为新的密钥;H(K*ORopad,H(K*ORipad,te*t))(1)将K扩充成B字节为K1(例如:K长度20字节,而B=64字节,则K通过补充44个字节的0形成64字节;(2)K1与ipad进行*OR形成新的K2;(3)如'te*t'不够64字节扩充形成K3;(4)对K2和K3进行HASH256产生输出Out1;(5)K1与opad异或形成K4;(6)扩充K4到B字节形成K5;(7)对K5和Out1,进行哈希变换输出Out2。SHA-256算法SHA-256是一种哈希算法,能够对一则长度为l的消息M产生散列值。SHA-256输入输出输入参数:参数长度(bits)说明M0消息长度264即将进行哈希处理的消息,IV256bit初始化的{Y0,Y1,Y7}输出参数:参数长度(bits)说明Digest256bitSHA-256生成的哈希摘要SHA-256算法描述一、SHA-256预处理a.对消息M进行分拆和填充,规则如下:设有一个任意长度的消息m,将m按512比特块进行分拆,对最后一个比特块(至少含有1比特,至多512比特)填充0或1成一个448比特的消息块:m=m1m2m3…mt-1m其中mk(k=1,2,…t-1)为512比特的消息块,mt’为448比特的消息块。填充规则如下:从m的最低位开始,先添加一个1,接着再添加若干0,使m的最后一个不足448比特的块填充成为一个448比特的块。如果m分拆后的最后一个块本身就是448比特的块,则也必须按照上述方法添加一个1及若干个0,即要填加成512比特将最后的消息块分成512及448的两个块。b.将原始数据的长度补到已经过a步骤处理后的消息后面。用一个64位的数据来表示原始消息的比特长度。c.最后将数据分成t个块,每块为512比特。d.用16进制数初始化8个工作变量Y0~Y7:Y0=0*6a09e667Y1=0*bb67ae85Y2=0*3c6ef372Y3=0*a54ff53aY4=0*510e527fY5=0*9b05688cY6=0*1f83d9abY7=0*5be0cd19二、SHA-256使用的函数和常数函数常数:C0到C63三、SHA-256的散列计算SHA-256预处理完成后,将每个消息分组(mk)分成16个32-bit的子分组(Z0~Z15),再按以下步骤1规则变换成64个32-bit的子分组(Z0~Z63),组成一个有64个32-bit单元的消息表,按次序依次进行处理。Fork=1tot(说明:t为消息分组的个数){1、计算产生消息表{Z0,Z1,…,Z63}Mk的容转换为Z0~Z15,Z0包含512位中的最左32bit。i=16~63的情况下:2、对{*0~*7}赋值:3、计算新的{*0~*7}:步骤3过程如下图所示:4、生成中间散列值{Y0~Y7}:}经过t圈循环之后,得到最后的哈希摘要结果:Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7。转换成32个字节的序列。Y0占用前4个字节,Y1占用接着的4个字节,如此类推。第一个字节(left-most)对应于Y0的大头字节(mostsignificant)。第32字节对应于Y7的小头字节(leastsignificant)。该32字节应转换为256bit字符串。第一个bit(left-most)代表字节0的themostsignificantbit,第256个bit(left-most)代表第32字节的最heleastsignificantbit。密钥层次与eNB相关的密钥包括:用于生成完整性保护和加密密钥的KeNB- FC=0*11,- P0=UplinkNASCOUNT,- L0=lengthofuplinkNASCOUNT(i.e.0*000*04)采用256-bitKASME为主密钥,通过HMAC-SHA256算法生成。临时密钥KeNB*- FC=0*13- P0=PCI(targetphysicalcellid)- L0=lengthofPCI(i.e.0*000*02)- P1=EARF-DL(targetphysicalcelldownlinkfrequency)- L1lengthofEARF-DL(i.e.0*000*02)当切换时采用垂直衍生方式时采用256-bitNH为主密钥生成,采用水平衍生方式时采用256-bitKeNB为主密钥,通过HMAC-SHA256算法生成。临时密钥NH- FC=0*12- P0=SYNC-input- L0=lengthofSYNC-input(i.e.0*000*20)采用256-bitKASME为主密钥生成,通过HMAC-SHA256算法生成。用于信令数据加密的KRRCenc- FC=0*15- P0=algorithmtypedistinguisher(0*03)- L0=lengthofalgorithmtypedistinguisher(i.e.0*000*01)- P1=algorithmidentity(0*00、0*01、0*02、0*03)- L1=lengthofalgorithmidentity(i.e.0*000*01)采用256-bitKeNB为主密钥生成,通过HMAC-SHA256算法生成。用于完整性保护的KRRCint- FC=0*15- P0=algorithmtypedistinguisher(0*04)- L0=lengthofalgorithmtypedistinguisher(i.e.0*000*01)- P1=algorithmidentity(0*00、0*01、0*02、0*03)- L1=lengthofalgorithmidentity(i.e.0*000*01)采用256-bitKeNB为主密钥生成,通过HMAC-SHA256算法生成。。用于数据业务加密的KUPenc- FC=0*15- P0=algorithmtypedistinguisher(0*05)- L0=lengthofalgorithmtypedistinguisher(i.e.0*000*01)- P1=algorithmidentity(0*00、0*01、0*02、0*03)- L1=lengthofalgorithmidentity(i.e.0*000*01)采用256-bitKeNB为主密钥生成,通过HMAC-SHA256算法生成。TableA.7-1:AlgorithmtypedistinguishersAlgorithmdistinguisherValueRRC-enc-alg0*03RRC-int-alg0*04UP-enc-alg0*05AlgorithmIDValue算法名称EIA00*00NullIntegrityProtectionalgorithm128-EIA10*01SNOW3G128-EIA20*02AES128-EIA30*03ZUC接入层的密钥生成网络侧密钥产生机制图属性密钥名称长度作用产生方法KeNB256bit用于计算KUPenc、KRRCenc、KRRCint初始时,取值为KeNB(Initial);后续取值为KeNB*中间密钥KeNB(Initial)256bit根密钥KeNB,用于生成eNB的PDCP层安全密钥。MME根据UplinkNASCOUNT,Kamse作为密钥生成KeNB。对应NCC=0。UE采用相同方式生成密钥。KeNB*256bit用于计算切换目标小区的KeNB。当切换完成后,自动转为KeNB使用。KeNB*由eNB生成。NCC变化时采用垂直衍生方式,根据NH及PCI/UARF生成;NCC不变时采用水平衍生方式,根据KeNB及PCI/UARF生成。UE采用相同方式生成密钥。NH256bitNH和NCC总是配对使用,每次NH计算进行NCC++,可通过HANDOVERREQ和PATHSWITCHACK通知eNB。当NCC变化时,基站将NCC通过空口通知UE;UE根据NCC取值确定垂直方向的密钥。NH由MME生成。NCC为0时,采用最新生成的KeNB作为输入,Kamse作为密钥生成NH;NCC为其他取值时,采用上一个NH作为输入,Kamse作为密钥生成NH。MME接收handoverrequired和pathswitchrequest时,总是进行NH计算,并进行NCC++。UE根据空口通知的NCC,按照相同方式生成NH。信令数据及用户数据密钥KUPenc128bit用于用户面下行数据加密。根据KeNB,RRC-enc-alg,AlgorithmID生成。KRRCenc128bit用于下行RRC加密。根据KeNB,RRC-int-alg,AlgorithmID生成。KRRCint128bit用于下行RRC完整性保护。根据KeNB,UP-enc-alg,AlgorithmID生成。接入层的密钥处理机制:各种场景下的密钥处理:初始接入――总是采用KeNB(Initial)作为KeNB。MME在初始连接建立时,计算NCC=1对应的NH,保存NCC=1,NCC=1对应的NH作为MME保存的{NH,NCC}对,但不将NH值发送给eNB。在收到S1初始上下文建立请求消息时,eNB将NCC值设置为0。此后如果发生*2切换或eNB切换,只能使用水平衍生的密钥产生机制,根据KeNB和PCI,带宽获取KeNB*。S1切换――根据S1切换请求中的{NH,NCC}对,通过垂直衍生方式进行密钥生成,根据NH计算KeNB*,作为KeNB。*2切换――如果存在未使用的{NH,NCC}对,通过垂直衍生方式进行密钥生成,根据未使用的NH计算KeNB*,作为KeNB;否则,通过水平衍生方式进行密钥生成。切换完成后的PATHSWITCH过程,MME在PATHSWITCHACK中携带{NH,NCC},目标eNB可以保存该{NH,NCC}对,在下次*2切换或eNB切换时使用;目标eNB也可以立即启用该{NH,NCC}对,通过小区切换方式通知UE。eNB切换――eNB切换与*2切换的处理方式类似,不同点在于eNB切换时可以不发起PATHSWITCH过程。如果eNB切换不发起PATHSWITCH过程,则不会从MME获取新的{NH,NCC}对,也就是说,连续的eNB切换可以按照水平衍生方向一直衍生,直到通过PATHSWTICH过程或S1切换过程重新获取到{NH,NCC}对。注:目前eNB实现,eNB切换流程需要发起PATHSWITCH过程,因此,eNB切换流程的密钥生成方式,等价于*2切换。 NCC的取值围为0~7。初始连接建立时,KeNB(Initial)通过KAMSE获取,初始NH通过KeNB(Initial)获取,此时NCC为0。MME在初始连接建立时,计算NCC=1对应的NH,保存NCC=1,NCC=1对应的NH作为MME保存的{NH,NCC}对。MME每次接收到PATHSWITCHREQ和HANDOVERREQUIRED消息,总是进行NH计算,并进行NCC++。理解:NCC=1对应的NH属于临时状态的NH,不能直接用来计算KeNB。如初始连接建立时eNB指示终端NCC=0;随后立即进行S1切换,则MME在S1切换请求中指示NCC=2。当NCC=7时,MME接收到PATHSWITCHREQ和HANDOVERREQUIRED消息,则重新采用KeNB(Initial),NCC=0,MME通过S1接口SecurityConte*tIE发送给eNB后,计算NCC=1对应的NH等于KeNB(Initial),保存NCC=1,NCC=1对应的NH作为MME保存的{NH,NCC}对。eNB影响分析流程分析初始业务接入图5.1-1初始安全性激活协议流程图UE和MME进行NAS交互,MME根据最近上行NAS消息(attachRequest/TAURequest/NASSecurityModeplete)的NASSN得到当前的uplinkNASCOUNT,计算KeNB(Initial)(参考36.401/A.3生成过程)。MME向eNB发送初始上下文建立请求消息,消息中携带最新计算的KeNB(Initial),即SecurityKeyIE,以及UE的安全能力信息UESecurityCapabilitiesIE(包含了UE的加密和完整性保护的算法)。eNB根据UE的安全能力信息,通过算法选择功能选择AS层加密和完整性保护算法。随后,eNB下发SecurityModemand消息,消息中包含AS层选择的加密和完整性保护算法;UE收到消息后,则根据最近上行NAS消息的NASCOUNT值计算KeNB。 安全模式控制过程中,SecurityModemand和SecurityModeplete消息采用本次安全模式控制过程指定的最新算法进行完整性保护,但采用原算法进行加解密;后续的所有消息,都采用本次安全模式控制过程指定的最新算法进行完整性保护和加解密。注:MME在进行KeNB计算之后,会根据KeNB更新NH,并将NCC设置为1,用于后续切换使用。下次切换发生时MME进行密钥垂直衍生,将根据NCC=1对应的NH值,计算NCC=2的NH,并把(NCC=2,NCC=2对应的NH对)通过S1HANDOVERREQUEST或PATHSWTICHACK消息知eNB。eNBUP对初始安全消息处理:对SecurityModemand消息:只进行完整性保护,不加密对SecurityModeplete消息:只进行完整性校验,不解密对于SecurityModeFailure消息:协议规定该消息不进行完整性保护注:若UP对SMC后的所有消息(包括SecurityModeFailure消息)进行完整性检查,必然导致完整性检查失败,SecurityModeFailure消息无法传递到上层。*2切换图5.1-2*2切换过程安全部分协议实现流程图*2切换过程中,如果存在未使用的{NH,NCC}对(如上次*2切换过PATHSWITCHACK消息获取的{NH,NCC}对),源eNB需要立即使用该{NH,NCC},即采用垂直衍生方式,通过NH计算KeNB*。衍生方式有如下两种:(1)水平衍生:根据PCI,frequencyEARF-D,KeNB计算KeNB*(2)垂直衍生:根据HN源eNB根据水平衍生方式或者垂直衍生方式计算KeNB*后,通过HandoverRequest消息,将{KeNB*,NCC},通知给目标eNB。源eNB生成KeNB*存在下述几种方式:如果为初始接入后的第一次*2切换,使用初始KeNB生成KeNB*,则NCC为0;如果不存在未使用的{NH,NCC}对,采用水平衍生方向进行密钥衍生,则采用KeNB生成KeNB*,NCC保持不变。如果存在未使用的{NH,NCC}对,采用垂直衍生方向进行密钥衍生,NCC加1,并采用与NCC关联的NH生成KeNB*。目标eNB使用KeNB*直接作为KeNB使用,并将NCC放在目的到源透明盒的RRC重配消息中;此外,目标eNB根据消息中的UE安全能力信息,通过算法选择功能选择AS层加密和完整性保护算法。目标eNB通过源eNB向UE发送RRC重配消息,消息中携带NCC以及选定的AS层加密和完整性保护算法。UE从源eNB接收RRC重配消息后,则根据消息中指定的NCC计算KeNB,存在两种情况:接收的NCC与当前使用的NCC相同UE采用水平衍生方向进行密钥衍生,根据当前KeNB生成KeNB*,切换到目标侧后直接将KeNB*作为KeNB使用。该场景特例:初始接入后的第一次*2切换,eNB下发的NCC=0,UE当前使用的NCC=0,UE同样采用水平衍生方向进行密钥衍生。接收的NCC与当前使用的NCC不同UE采用垂直衍生方向进行密钥衍生,根据与NCC关联的NH生成KeNB*。UE根据目标侧的加密完整性保护算法,采用KeNB生成的KRRC-enc,KRRC-int,andKUP-enc,对后续信令数据(包括RRC重配完成消息)进行加密和完整性保护,业务数据进行加密。完成*2切换后,目的eNB向MME发送S1PATHSWITCHREQUEST。MME收到S1PATHSWITCHREQUEST消息,根据KASME和本地保存的NH计算新的NH,并将NCC加1。之后将重新计算的{NH,NCC}pair,通过S1PATHSWITCHREQUESTACKNOWLEDGE,通知给目标eNB。在*2切换过程中,KeNB*是由源eNB计算并传输给目标eNB的,源eNB知道目标eNB中的加密密钥;此时目标eNB可直接使用源侧计算的KeNB,也可以根据NH垂直衍生新的KeNB。目标eNB存在两种处理方式:目标eNB将{NH,NCC}pair保存起来,在后续的切换过程中使用。目标eNB可以根据重新获取的NH,垂直衍生重新计算KeNB,并通过小区切换方式通知UE。UE按照最新NCC,通过垂直衍生方式计算KeNB。此后,目标eNB和UE都采用最新垂直衍生方式得到的KeNB生成最新KUPenc、KRRCenc、KRRCint,进行加密和完整性保护。eNB切换 eNB切换流程,与*2切换流程类似。eNB切换完成后,根据eNB实现方式不同,存在两种情况:需要进行PATHSWITCH过程,处理流程同*2切换。不需要进行PATHSWITCH过程,每次eNB切换时密钥通过水平衍生方向生成。S1切换图5.1-4S1切换流程图MME收到HandoverRequest消息之后,根据NH和KASME计算NH,并将NCC加1。MME将重新计算的NH和NCC保存起来,并通过S1HANDOVERREQUEST.消息,将{NH,NCC}pair,发送到目标eNB,消息中还包含UE安全能力信息。目标eNB接收到HANDOVERREQUEST消息,根据消息中的{NH,NCC},计算KeNB,同时删除保存的没有使用的{NH,NCC}pairs;根据消息中的UE能力信息,通过算法选择功能选择AS层加密和完整性保护算法。目标eNB通过透明盒传送到源eNB,源eNB下发RRC重配消息,消息中包含选定的加密和完整性保护算法、NCC参数。UE接收RRC重配消息后,根据NCC计算KeNB,存在两种情况:接收的NCC与当前使用的NCC相同,UE采用水平衍生方向进行密钥衍生,根据当前KeNB生成KeNB*,切换到目标侧后直接将KeNB*作为KeNB使用。接收的NCC与当前使用的NCC不同,UE采用垂直衍生方向进行密钥衍生,根据与NCC关联的NH生成KeNB*。UE根据目标侧的加密完整性保护算法,采用KeNB生成的KRRC-enc,KRRC-int,andKUP-enc,对后续信令数据包括RRC重配完成消息进行加密和完整性保护,业务数据进行加密。RRC重建RRC重建包括两种场景:稳态的RRC重建,以及切换过程中的RRC重建。稳态的重建存在几种可能:源小区重建――可重建其他小区重建(其他小区属于源eNB)――可重建其他小区重建(其他小区不属于源eNB)――无法重建切换过程中的RRC重建存在几种可能:源小区重建――可重建目标小区重建――可重建第三小区重建(第三小区属于源eNB)――可重建第三小区重建(第三小区属于目标eNB)――可重建第三小区重建(第三小区属于第三eNB)――无法重建在切换过程中如果切换失败,UE可能会进行RRC重建过程。此时UE可能会选择和目标小区不同的一个小区,发起RRC连接重建过程。为保证UE的RRC连接能够成功重建,在切换准备过程中,源eNB会为目标eNB控制的多个小区分别计算KeNB*,也会为源eNB控制下的多个小区计算KeNB*。切换准备过程中,源eNB在HandoverPreparationInformation消息的AS-Conte*tIE的ReestablishmentInfoIE中(参见36.331)包含目标eNB控制的多个小区对应的重建信息(KeNB*,ShortMAC-I,CellIdentity)信息;AS-ConfigIE中包含了源侧使用的安全算法。同时,源eNB部维护其控制下的多个小区对应的重建信息(KeNB*,ShortMAC-I,CellIdentity)信息。ShortMAC-I根据VarShortMAC-Input作为MESSAGE,根据原服务小区的KRRCint作为KEY计算获得;而VarShortMAC-Input由目标小区cellIdentity,原服务小区的PCI和c-RNTI组成(理解:为支持源小区RRC重建,源eNB控制下的多个小区,包含源小区本身)。为了避免UE无法执行在切换或者重建过程发生的RRC连接重建失败,UE需要在切换和RRC连接重建完成之前,一直保存KeNB值(理解:UE发生RRC连接重建,不管在源小区重建还是在其他小区重建,都可以通过该KeNB推出重建小区的KeNB)。在*2切换时,目标eNB直接使用源侧计算的KeNB*作为KeNB;在S1切换时,目标eNB忽略源侧提供的KeNB*,根据从MME收到的{NH,NC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论