|
TD-SCDMA系统终端完整性保护方案 ' z/ m6 i8 Q3 b2 W f6 y
1终端安全特性的实现概述
" {( ^4 f z8 } 在TD-SCDMA系统中,终端接入网的安全性能主要有三个方面的措施:用户鉴权、数据完整性保护和数据加密。终端安全特性的启动是由网络通知的。其中,鉴权过程是在非接入层的MM或GMM实现,用于确定用户的合法性,同时产生接入层完整性保护和加密所需要的密钥。数据加密分为语音业务的加密和数据业务的加密,语音业务的加密由MAC层进行加密,数据业务由RLC层完成。数据完整性保护过程采用F9算法,加密过程使用F8算法。数据的完整性保护过程主要是在RRC子层完成,用于确保信令数据发送和接收的正确性。本文将详细介绍实现数据完整性保护的过程。
& K* h- \ ^$ D0 @3 k+ ~. W$ b2 A: M! k# c ?& L& g
2终端完整性保护过程分析
$ b) I" a+ \! [# `: j2 x5 z8 ?/ Q2 S( Q1 h1 U7 Z
) p- Z# K& v8 L6 L/ @ ]图1 ' V: L2 x3 W9 ]$ O
4 {0 ]6 ~: \, p" q 终端进行完整性保护和加密的过程是由网络来启动的,具体过程如图1所示。网络发送SECURITYMODECOMMAND层3消息要求RRC子层开始消息完整性保护过程。终端的RRC子层在收到SECURITYMODE COMMAND消息之后,解析消息的内容,发送SECURITY MODE COMPLETE消息响应网络。6 Q& _0 v/ ]5 e2 j8 w
4 e) e7 N. j# a
SECURITYMODECOM-MAND消息包括安全能力单元、完整性保护信息单元、加密信息单元、域信息单元等消息单元。其中,完整性保护信息单元用于启动或修改RRC子层的完整性保护过程;域信息单元用于指定进行完整性保护的域,包括电路交换(CS)域或分组交换(PS)域,在选择完整性保护的密钥时需要使用该参数,详见后续描述。& P# {3 R% @1 Q; ?+ t( A
# `' u5 h1 i: j: k' q4 k" k& h: \
3完整性保护过程在RRC子层的实现; {/ {/ L. @! W) A; g
: m& {$ `9 f2 L. ^& f7 H" }% h
(1)完整性保护过程概述) U4 F: }( l. w, |: W# m
; w( M0 d& |: b: F3 Q4 {
RRC子层在收到SECU-RITYMODECOMMAND消息后,解析消息中的完整性保护信息单元来启动完整性保护过程。在完整性消息单元中包含了完整性保护的算法指示及用于完整性保护的其他参数。4 @% Y) m3 [ G; m
# h; E! W% Z& V! o8 G
完整性保护采用的F9算法如图2所示。
3 k( Z2 J5 W3 F/ d& }
: ~) F1 q& e, v0 O. q" e0 z m2 q
7 ` K3 A- |# W5 S图2
+ H* z6 N8 T# c% P2 |1 Z! b9 N. x9 f9 D" }* D
F9算法的入口参数介绍如下。0 L# ~8 J+ X9 p0 o( l5 u7 M; E
! p$ C# ]" O1 j! A+ z9 C: R+ F: ?7 {
IK:完整性保护密钥。由MM层或GMM子层在鉴权过程中产生。如果没有鉴权过程的情况下,密钥是开机的时候由USIM存储的上一次关机时保存的密钥,密钥由MM层发送到RRC层并保存。CS域和PS域各有一个IK,RRC此次选择的是SECURITYMODECOMMAND消息中,域信息单元所指定域的IK来进行完整性保护。
+ f) A4 r5 f q, l* C' l7 |+ K% ?& v9 }: }2 j0 r. ~8 r e
FRESH:SECURITYMODECOMMAND消息携带的随机数。
7 j3 d/ I4 C, P1 m* F H: M3 x) F$ z7 y
DIRECTION:完整性保护的方向。下行使用DIRECTION等于1,上行使用0。
, \& z% \3 Q! Q) N$ M U& N1 V% S
# |1 @; `6 T6 M# E MESSAGE:发送的消息内容,包括了消息的长度指示。& N) ^7 C# u1 ~6 `1 U( \ Y
! K! Q* U7 I% O8 x% [) t* x2 U F
9 g ^* B; I$ N; a7 n7 x
图3
7 n5 c/ P$ n, L; ~" v7 D2 r' c: q: W4 J8 T% f6 i8 X3 m
COUNT_I:该参数共32bit,由两部分组成,前一部分超帧号RRCHFN有28 bit,后4 bit为RRC子层消息序列号(RRC SN),如图3所示。每个信令SRB分别有一个上行的COUNT_I和下行COUNT_I,分别用于上下行完整性保护。该参数是RRC子层在收到SECURITY MODE COMMAND消息后初始化的。当RRC子层第一次收到SECURITY MODE COMMAND消息后,根据是否进行鉴权即是否收到新的IK,RRC将COUNT_I的HFN部分初始化为0或START值,同时RRC子层初始化上行RRC SN为0,这样确定了上行COUNT_I的初始值。上行每发送一条RRC消息,消息序列号增加1,消息序列号为4 bit,因此最大消息序列号为15,每发送15条为一个循环,每到一个循环周期HFN加1,确定每条上行消息的COUNT_I值。下行COUNT_I的HFN部分初始化与上行部分相同,只是下行消息的RRC SN是由收到消息的完整性检查单元携带的。当启动完整性保护后,在每个SRB上收到的第一条RRC消息中取出带的RRC SN,用于计算鉴权码,如果收到的消息正确,那么将该RRC SN 赋值给下行COUNT_I的低位,确定下行COUNT_I。9 A( V5 C8 e3 T3 d- q6 n( M
7 x0 D4 x' z( ?5 D: A! U4 _% ^
(2)上行消息完整性保护实现方案
" K8 A% K% s6 p: f9 m7 G, I
* y, `5 ^/ }+ K2 U% E* x- U5 L 在启动了完整性保护过程后,RRC在组装发送信令消息时必须增加消息的IntegrityCheckInfoIE信息单元。首先,RRC组装需要发送的消息在组装时,设置需要完整性检查比特为1,预留32位的比特(设置为0)位置给鉴权码(Message Authentication Code)和4比特的RRC SN,之后是需要组装的消息内容。对消息进行ASN编码,编码后得到需要进行完整性保护的消息序列和消息长度。. S: R2 q- I8 s! q& j0 V
' \3 J7 r. k' x* ?0 g6 g% @7 u RRC进行选择完整性保护的密钥,需要考虑新的完整性保护的激活时间问题。发送的消息的RRCSN等于当前的RRCSN加1,如果大于或等于完整性保护的激活时间(由最近一次SECURITY MODE COMMAND消息携带的),那么使用新的完整性密钥IK,否则使用旧的IK。因为CS域和PS域各有一个IK,我们选择收到的SECURITY MODE COMMNAD消息CN Domain IE所指定域的IK。将消息内容(MESSAGE)、消息长度、IK 、FRESH、COUNT_I、DIRECTION参数送到F9函数,计算出鉴权码,修改已经编码过的消息的ASN数据的第2个比特到第37个比特,其中2到33比特位计算出来的鉴权码,34比特到37比特为消息的RRC SN。这样就完成了消息的完整性保护及编码。按照这个方案避免了对消息进行两次ASN编码,第二次我们只是修改了第一次编码后的ASN数据的前37个比特,简化了消息的组装过程。
9 Z+ h! t" E k: I
+ c8 [, L; R1 M5 Q" h2 {% ~. u2 b1 B (3)下行消息的完整性保护检查实现方案$ R: c6 o4 w) l5 b, O. ~5 m
; R/ q. H& o2 _6 D! |9 i9 C! o 下行的完整性保护过程是RRC子层对收到的消息进行完整性检查即对收到消息的鉴权码的检查。如果收到的消息中携带的鉴权码与RRC子层计算出的消息鉴权码不一致,认为收到的消息出错将直接丢弃该消息。下面我们就详细分解一下终端对收到消息的鉴权码计算过程。
) C2 {" n6 I/ u; D; T: P+ }
5 B. E: v& \: ?9 J 首先取得解ANS编码前的层3消息数据,将其前第2个比特到第33个比特替代为0,第34到37比特替代为RRCSN,构成F9算法的消息流,而对于消息的长度在RLC送消息到RRC子层的参数包含了消息长度。下行消息COUNT_I的确定,首先每次我们收到一条正确的消息,都把该消息的RRCSN保存在一个本地变量中。在下一次收到一条RRC消息时,我们通过消息的ASN解码得到消息中携带的RRCSN,该SN与本地保存的RRC SN比较。如果两个RRC SN 相等,那么就说明消息收到过,直接丢弃该消息;如果收到的RRC SN小于本地的RRC SN ,那么本地保存的 RRC HFN 加1。
5 j5 x, H" I1 k" w7 ?# \: E- |
# B# P$ r4 e$ B8 j0 V( v 由本地保存的下行HFN和消息中携带的本消息RRCSN确定了下行消息的COUNT_I。上行密钥的选择与上行的相同。下行完整性保护的FRESH值与上行相同。1 t+ S0 z9 B- S
, O7 |+ w+ N `5 Y' N. B- Y9 p$ s 我们把确定的消息内容(MESSAGE)、消息长度、完整性保护密钥IK、下行COUNT_I、FRESH、DIRECTION的值输入F9函数,得到UE端RRC子层计算的鉴权码的值,与收到的消息中的鉴权码进行比较,如果两者相同,那么接收收到的消息,否则丢弃收到的消息。5 B: D2 t2 Z' U5 ]0 {. }
) `! ], g0 j0 G) i. L9 s+ r( h
消息完整性保护过程很好地检测出可能由部分消息内容丢失、消息被窃取或消息发送多次而引起的消息错误,避免了终端对错误消息的处理。
. `$ o- g4 F8 K$ _3 S% _. u& a! c k) H
(4)下行非顺序接收消息的完整性检查9 c8 O% B$ ^1 A) ~# t' O
& N. D) }8 v; _
按照上面描述的方案,可以正确地计算出消息的鉴权码,该方案的关键就是如何正确地选择F9算法的IK和COUNT_I值。在收到消息的RRCSN是顺序的情况下,可以保证方案的正确性;在收到消息的RRCSN不是顺序的情况下,我们在选择完整保护IK时可能发生选错的情况。下面我们考虑两种RRC SN不是顺序的情况的处理。
+ v* \2 ~. R3 Y9 D6 w7 t9 R
- m* k- }5 `7 ?( V, |/ ?4 r 第一种情况:假设本地保存的RRCSN为5,新的完整性保护开始的时间为9 。本次RRC 收到的消息RRC SN 为4,那么按照原来的方案判断RRC SN 4小于5的情况下,HFN必须增加1 。但是,也有可能RRC收到消息RRC SN并不是顺序的,这导致我们应该是先收到RRN SN 为4这条消息,而却先收到了RRC SN为5的这条消息,也就是这两条消息的HFN应该是相等的。这样按照我们之前的设计方案计算出来的鉴权码必然与消息中携带的鉴权码不等,导致正确消息的丢弃,这种情况下应该有另外的保护措施。解决方案是每次做HFN 加1的时候我们都采用一个标志记录这个行为,然后按照正常的流程计算鉴权码,当我们发现鉴权失败,检查HFN是否曾经增加过,如果增加过我们把HFN减1 ,重新送入F9函数再计算,计算出来的结果再比较。
- W/ X0 o2 K6 d& L, |0 _! F: S
' v0 E g$ f: f 第二种情况:假设本地下行的RRCSN为1,新的安全模式激活时间为6。当前收到消息的RRC SN 为15,那么根据正常的流程发现收到消息的SN 15大于激活时间6,这样我们会选择新的IK,例如之前为完整性的CN域为CS ,重新收到SECURITY MODE COMMAND 的CN域为PS,那么此时我们就会由原来CS 域的IK选择成PS 域的IK进行鉴权码的计算。计算结果发现鉴权码不同,此时可能是由于RRC子层本身在选择IK的时候选错。由于消息的不顺序发送,使得RRC SN为15的消息在RRC SN等于1的之后收到,误认为已经过了新的安全模式的激活时间,选择了新IK。为了防止这种错误,我们在第一计算结果比较错误后进行第二次鉴权码计算,使用旧的IK进行计算,计算出来的结果再与消息中携带的鉴权码进行比较。
# p6 ^% {/ K+ f$ Z6 q! z0 _# e7 r6 _5 [0 @2 c" A. L+ g. e
在上面两种特殊的情况中,我们都是采用对消息进行第二次的鉴权码计算,避免了由于网络发送消息RRCSN的非顺序性,引起第一次鉴权码计算错误丢弃消息的情况,保证鉴权码计算的正确性,进一步提高了完整性保护的性能。
( l' h7 n/ n8 I另:在【多多手机网】看到有个A-key计算器的东东,感兴趣的兄弟去看看,早CDMA专区6 c6 ^, t, \6 H% E6 Z A3 K" k
又看到个读A-key软件,随便发了,会用的兄弟出来说说是什么东东!:)1
) U! {! L2 X3 C) W) P/ [- q; }9 R! ^- e$ m# U
[ 本帖最后由 闷声色狼 于 2008-2-23 10:50 编辑 ] |
|