4.2人机界面设计 此次设计的重点在于KASUMI算法的研究,但是为了更好的验证和实现KASUMI算法,做了图形化的实现系统,现将该系统的功能做详细的介绍: copyright paper51.com 1、图4-3为该系统的主要界面也是唯一的界面。该界面由几个模块组成:输入区、输出区和操作区。该系统是为了验证KASUMI算法的正确性,所以产生明文和密钥有两种方式:手动输入和随机输入。在前面引言里我已经提到KASUMI算法是对64位二进制位明文和密钥为128位二进制位。为了方便验证,我将用十六进制来代替二进制,这样在输入的时候比较方便,因为1位十六进制位代表4位二进制位,这样大大减小了明文和密钥的长度,也减少了不必要的麻烦,如:如果输入二进制位的话,你要慢慢的输入64位,一不注意就会导致输入错误,如果用十六进制位的话,输入才16位,这样比较容易输入也比较容易查出错误来。 copyright paper51.com 2、当启动对话框准备输入的时候,如果在明文和密钥没有输入或随机产生的情况下,系统会自动弹出一个模态对话框,提示用户明文必须输入16位,如图4-4。当正确输入明文但没有输入密钥的情况下,系统会自动弹出一个模态对话框,提示用户密钥必须输入32位,如图4-5。当明文和密钥在输入的情况下,但是输入的长度并不是16位或者32位,系统会自动弹出一个模态对话框,提示用户明文必须输入16位或者密钥必须输入32位,如图4-6、4-7。 内容来自论文无忧网 www.paper51.com
内容来自论文无忧网 www.paper51.com 图 4-3 人机对话界面 图4-4 明文为空的报错界面 http://www.paper51.com
3、随机产生明文和密钥,本系统主要是为了验证KAUSMI算法程序实现的正确性,并没有应用KASUMI算法去对文件或文字进行加密或解密。就是因为只是验证程序实现的正确性,所以我采用了随机产生明文和密钥的方法以便快速验证,并不需要每次都去手动输入,这样大大提高了验证的效率。随机产生明文和密钥非常方便,在随机产生明文和密钥的时候它不会出现错误,比如它不可能出现不符合要求的字符,也不可能出现长度不正确。因为随机产生明文和密钥的时候已经限定了它的字符和长度。随机产生明文和密钥并进行加密如图4-9。 paper51.com
copyright paper51.com
图4-5密钥输入报错界面 图4-6 明文输入报错界面 http://www.paper51.com 内容来自www.paper51.com 图4-7密钥输入报错界面 图4-8 加密界面 内容来自www.paper51.com 4、解密功能,在3GPP中,KASUMI算法更多应用的只是它的加密功能,因为KASUMI算法产生的密文只是作为3GPP中的密钥,所以不需要去解密。但是在本系统中增加了KASUMI算法的解密功能,因为我要去验证KAUSMI算法程序是否正确。KASUMI的解密函数是从KASUMI的加密函数的定义中导出来的,这里不用去理解它是怎么导出来的,将在关键代码分析的时候具体给出。在验证解密的时候也同样运用了随机产生密钥和密文,随机产生的好处见以上第3点。解密功能如图4-9、4-10 内容来自论文无忧网 www.paper51.com http://www.paper51.com 图4-9 加密并解密界面 图4-10 解密界面 http://www.paper51.com 本系统相当于其他系统非常简单,功能也非常少。但是这是按照本课程设计需要所设计的,本课程设计的重点不在于此。重点的是算法的研究与算法的程序实现。 内容来自www.paper51.com 5 关键代码分析 http://www.paper51.com 本设计的重点是KASUMI算法的研究,除了算法程序以外的关键代码相对较少,现在着重分析KASUMI算法的程序实现代码: paper51.com 5.1FI函数的程序实现 http://www.paper51.com static u16 FI( u16 indata, u16subkey ) 内容来自www.paper51.com
{ http://www.paper51.com u16nine, seven; 内容来自www.paper51.com staticu16 S7[] = {}; http://www.paper51.com staticu16 S9[] = {}; 内容来自www.paper51.com nine = (u16)(indata >> 7);//通过移位获取16位数据的高9位 内容来自论文无忧网 www.paper51.com seven= (u16)(indata & 0x7F); //通过移位获取16位数据的低7位 copyright paper51.com nine = (u16)(S9[nine] ^ seven); 内容来自www.paper51.com seven= (u16)(S7[seven] ^ (nine & 0x7F)); copyright paper51.com
seven= seven ^ (subkey >> 9); http://www.paper51.com nine = nine ^ (subkey & 0x1FF); paper51.com nine = (u16)(S9[nine] ^ seven); 内容来自www.paper51.com seven= (u16)(S7[seven] ^ (nine & 0x7F)); paper51.com indata= (u16)((seven << 9) + nine);//将seven左移9位,然后与nine相加,//转换成16位输出。 内容来自www.paper51.com
return(indata );//返回16位 copyright paper51.com } paper51.com
FI函数包含一个16位的数据输入indata和一个16位的子密钥subkey,输入的indata被分成不等的两部分,左半部分nine是9位,右半部分seven是7位,其中,indata = nine || seven 。与此类似,密钥subkey也被分成一个7位的子密钥和一个9位的子密钥。每一个FI函数使用两个S-box:S7映射一个7位的输入到一个7位饿输出,S9映射一个9位的输入到一个9位的输出。最后将得到indata=seven || nine ,即16位的输出。 内容来自论文无忧网 www.paper51.com 注:这里为了节约纸张,S7和S9表的内容没有给出,参见2.2.5 S-box paper51.com 5.2FO函数的程序实现 内容来自论文无忧网 www.paper51.com static u32FO( u32 indata, int n ) 内容来自论文无忧网 www.paper51.com { 内容来自论文无忧网 www.paper51.com u16 left, right; copyright paper51.com left = (u16)(indata >> 16);//移位得到高16位 copyright paper51.com right = (u16) indata;//强制转换成16位,即取低16位 内容来自www.paper51.com left = left ^ KOi1[n]; copyright paper51.com left = FI( left, KIi1[n] ); copyright paper51.com left = left ^ right; copyright paper51.com right = right ^ KOi2[n]; http://www.paper51.com right = FI( right, KIi2[n] ); 内容来自论文无忧网 www.paper51.com right = right ^ left; 内容来自www.paper51.com left = left ^ KOi3[n]; http://www.paper51.com
left = FI( left, KIi3[n] ); copyright paper51.com left = left ^ right; paper51.com indata = (((u32)right) <<16) + left;//移位合并 paper51.com return( indata ); 内容来自www.paper51.com } http://www.paper51.com
FO函数的输入由一个32位的数据输入indata和两个子密钥组成:一个48位的KO和一个48位的KI。32位的数据输入indata被分成两半,left和right,其中:indata = left || right 。并且48位的子密钥分成3个16位的子密钥,其中:KOi= KOi,1 || KOi,2 || KOi,3 http://www.paper51.com KIi = KIi,1 || KIi,2 ||KIi,3 paper51.com 对每一个整数j(1<=j <= 3),函数FO第j次循环上的运算定义如下: copyright paper51.com rightj=FI(leftj-1 KOi,j,KIi,j)rightj-1 paper51.com leftj=rightj-1 内容来自论文无忧网 www.paper51.com 最后得到函数FO的32比特的输出indata= left3||right3。 内容来自论文无忧网 www.paper51.com 5.3FL函数的程序实现 内容来自www.paper51.com static u32FL( u32 indata, int n ) 内容来自www.paper51.com { http://www.paper51.com u16 left , right , a , b ; 内容来自www.paper51.com left = (u16)(indata >> 16);//移位的高16位 内容来自论文无忧网 www.paper51.com right = (u16)(indata) ; //强制转换成16位,即取低16位 内容来自论文无忧网 www.paper51.com
a = (u16) (left & KLi1[n]) ; http://www.paper51.com
right = right ^ ROL16(a , 1) ; 内容来自论文无忧网 www.paper51.com b = (u16)(right | KLi2[n]) ; http://www.paper51.com left = left ^ ROL16(b , 1) ; 内容来自论文无忧网 www.paper51.com indata = (((u32)left) << 16)+ right ;//移位合并 内容来自论文无忧网 www.paper51.com return( indata ); 内容来自www.paper51.com } http://www.paper51.com FL函数的输入由32位的数据输入indata和32位的子密钥KL组成,子密钥分为两个16位的子密钥KLi,1和KIi,2,其中,KL =KLi,1 || KLi,2。输入的数据indata被分成两个16位的部分,left和right,其中,indata= left || right 。 内容来自论文无忧网 www.paper51.com |