AES-CMAC实验报告--信息与通信安全_第1页
AES-CMAC实验报告--信息与通信安全_第2页
AES-CMAC实验报告--信息与通信安全_第3页
AES-CMAC实验报告--信息与通信安全_第4页
AES-CMAC实验报告--信息与通信安全_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、本科实验报告课程名称:信息与通信安全姓 名:选择课题:C/C+实现加解密算法及其应用(实验一 )系:信电系专 业:信息与通信工程学 号:指导教师: 年 月 日目录1.实验内容与要求22.实验原理32.1 AES原理32.1.1 AES总体结构32.1.2 AES详细结构31.1CMAC原理72.实验环境94 代码实现94.1字节代替变换94.2 行移位变换114.3列混淆变换144.4 轮密钥加174.5 AES的加密与解密的实现224.6 CMAC代码实现235思考题276心得体会27附录(完整程序)281.实验内容与要求(1). 复习AES原理。(2). 用C/C+编写AES算法并调试通过

2、。(3). 复习CMAC原理。(4). 在实现AES基础上,用C/C+编写CMAC算法并调试通过。(5). 回答下列思考题。 AES解密算法和AES的逆算法之间有什么不同? CMAC与HMAC相比,有什么优点?2.实验原理2.1 AES原理2.1.1 AES总体结构下图展示了AES加密过程的总体结构。明文分组长度为128位即16字节密钥长度可以为16,24或32字节(在本次设计中选择16字节)。加密和解密算法是输入是一个128位的分组。在FIPS PUB 197中,这个分组被描述为4*4的字节方阵。这个分组被复制到state数组,饼子啊加密或解密的各个阶段被修改。同样,密钥也被描述为字节的方阵

3、,并被扩展为44字的密钥字序列。密码由N轮组成,其中轮数依赖于密钥长度,16字节密钥是10轮,前N-1轮由4个不同的变换组成:字节代替,行位移,列混淆,轮密钥加。最后一轮包含三个变换,而在第一轮的前面有一个起始的单变换(轮密钥加),可视为第0轮。每一个变换输入一个活多个4*4的矩阵,并输出一个4*4的矩阵,最后一轮输出为密文。同样,密钥扩展函数为N+1轮密钥,它们是互不相同的4*4矩阵。每一个轮密钥作为每轮的轮密钥加变换的一种输入。2.1.2 AES详细结构1) AES算法未使用Feisel结构,而是在每一轮都使用代替和混淆将整个数据分组作为一个单一的矩阵处理。2) 输入的密钥被扩展为44个3

4、2位字所组成的数组wi,每轮由四个不同的字作为该轮的轮密钥。3) 由四个不同的阶段组成,包括一个置换和三个代替。字节代替:用一个S盒完成分组的字节到字节的代替。行位移: 一个简单的置换。列混淆:利用GF(28)上的算术特性的一个代替。轮密钥加:当前分组和扩展秘钥的一部分进行按位异或。(一) 字节代替变换如上图,字节代替变换是一个简单的查表操作。AES定义了一个S盒,它由16*16个字节组成的矩阵,包含了8位所能表示的256个数的一个置换。State中 的每个字节按照如下的方式映射为一个新的字节,把改字节的搞4位作为行值,低四位作为列值,以这些行列值作为索引从S盒的对应位置取出元素作为输出。而其

5、逆向操作则是有对应的逆S盒可进行查表。(二) 行移位变换 如上图,其正向行移位变换中,state的第一行保持不变,把state的第二行循环左移一个字节,state的第三行循环左移两个字节,state的第四行循环左移四个字节。例如: 逆向行移位变换将state中的后三行执行相反方向的一位操作即可。(三) 列混淆变换如上图,列混淆的正向变换是对每列单独进行操作。每列中的每个字节被映射为一个新值,此值由该列中的4个字通过函数变换得到。这个变换可有下面基于state的矩阵乘法表示:乘积矩阵中的每个元素军事一行和一列中对应元素的乘积之和。这里的乘法和假发都是定义在GF(2n)上的。状态中单列的列混淆变换

6、可表示为: 其中一个例子如下: (四) 轮密钥加变换如上图,在轮密钥加变换中,128位的state按位与128位的轮秘钥XOR。该操作可以视为state的一列中的四个字节与轮秘钥的一个字进行列间的操作,例如:(五) AES密钥扩展AES密钥扩展算法的输入值是一个4个字,输出值是一个由44个字组成的移位线性数组。输入密钥字节被复制到扩展密钥数组的前4个字。然后每次用四个字填充扩展密钥数组余下的部分。在扩展数组中,每一个新增的字wi的值依赖于wi-1和wi-4。在4个情形中,三个使用了异或。对w数组中下标为4的倍数的的元素采用了更复杂的函数来计算:(1) 字循环的功能时使一个字中的四个字节的循环左

7、移一个字节,即将输入字B0,B1,B2,B3变成为B1,B2,B3,B0.(2) 字代替利用S盒对输入字中的每个字节进行字节代替。(3) 步骤1和步骤2的结果再与轮常量Rconj相异或。1.1 CMAC原理基于密码的消息认证码(CMAC)对于AES,3DES适用,它使用三个密钥:一个密钥长为K,用在密文分组链接的每一步,两个长度为n的密钥,其中k是密钥长度,n为密文分组长度。并且两个n位的密钥可以从加密密钥导出,而不是单独提供。首先,当消息长度是分组长度b的n倍时,我们考虑CMAC的运算情况。对AES,b=128,对于3DES,b=64.这个消息被划分为n组,(M1,M2,Mn)。算法使用了k

8、比特的加密密钥K和n比特的常数K1。对于AES,密钥长度k为128,192和256比特,对于3DES,密钥长度为112或168比特。CMAC按如下方式计算:其中:T消息认证码,也称为tagTlenT的比特长度MSBs(X)比特串X最左边的s位如果消息不是密文分组长度的整数倍,则最后分组的右边(低有效位)填充一个1和若干个0,使得最后的分组长度为b。除了使用一个不同的n比特密钥K2代替K1外,与前面所述一样进行CMAC运算。两个n比特的密钥由k比特的加密密钥按如下方式导出:其中乘法()是在域GF(2n)内进行,X和X2是该域的一次和二次多项式。因此X的二元表示为n-2个0,后跟10,X2的二元表

9、示为n-3个0,后跟100。对于AES,已获批准的分组长度为X128 +X7 +X2 +X+2.。当消息长度是分组长度的整数倍:当消息长度不是分组长度的整数倍:2. 实验环境装有C_Free 的笔记本4 代码实现首先是实现AES的各个子模块,在验证其正确以后,再进行CMAC的认证算法的实现。4.1字节代替变换#includestatic unsigned char Sbox256 = /AES的S盒0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,0xca

10、, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,0x09, 0x83, 0x2c, 0

11、x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d

12、, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0

13、xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57

14、, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16;static unsigned char InvSbox256 = / AES的逆S盒 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36,

15、 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x

16、76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58,

17、 0x05, 0xb8, 0xb3, 0x45, 0x06,0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x

18、75, 0xdf, 0x6e,0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,

19、0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d;/字节代替变换void Sub

20、_Byte (unsigned char state44)int i,j;for(i=0;i4;i+) for(j=0;j4;j+) stateij=Sboxstateij;/逆向字节代替 void Inv_Sub_Byte (unsigned char state44)int i,j;for(i=0;i4;i+) for(j=0;j4;j+) stateij=InvSboxstateij;int main()unsigned char state44= 0xea,0x04,0x65,0x85, 0x83,0x45,0x5d,0x96, 0x5c,0x33,0x98,0xb0, 0xf0,0x

21、2d,0xad,0xc5 ;int i,j;/正向替换Sub_Byte(state);printf(正向代替结果:n) ;for(i=0;i4;i+) for(j=0;j4;j+) printf(%x ,stateij); printf(n); printf(n);/反向替换 Inv_Sub_Byte(state); printf(反向代替结果:n) ; for(i=0;i4;i+) for(j=0;j4;j+) printf(%x ,stateij); printf(n); 其测试结果如下,可见该功能可实现是正确的。4.2 行移位变换#include/行移位void Row_Shift(un

22、signed char state44) int i;unsigned char temp;/第一行保持不变,第二行左移一位 temp=state10;for(i=0;i0;i-)state3i=state3i-1;state30=temp; /逆向行移位void Inv_Row_Shift(unsigned char state44) int i;unsigned char temp;/第一行保持不变,第二行右移一位 temp=state13;for(i=3;i0;i-)state1i=state1i-1;state10=temp; /第三行右移二位temp=state20;state20=

23、state22;state22=temp;temp=state21;state21=state23;state23=temp;/第四行右移三位 temp=state30;for(i=0;i3;i+)state3i=state3i+1;state33=temp;int main()int i,j;unsigned char state44= 0x87,0xf2,0x4d,0x97, 0xec,0x6e,0x4c,0x90, 0x4a,0xc3,0x46,0xe7, 0x8c,0xd8,0x95,0xa6 ;Row_Shift(state);printf(正向行移位变换:n) ;for(i=0;i

24、4;i+) for(j=0;j4;j+) printf(%02x ,stateij); printf(n); printf(n); Inv_Row_Shift(state); printf(反向向行移位变换:n) ; for(i=0;i4;i+) for(j=0;j4;j+) printf(%02x ,stateij); printf(n); 测试结果如下通过比较,可知结果正确,因此该子模块实现。4.3列混淆变换#include/乘法处理部分 unsigned char x_time2(unsigned char state)/乘2处理 unsigned char temp; if (stat

25、e=0x80) temp=(state1)0x1b; /判断b7=1? else temp=(state1); return temp; unsigned char x_time3(unsigned char state)/乘3处理 state=statex_time2(state); return state; unsigned char x_time4(unsigned char state) /乘4处理 state=x_time2(x_time2(state); return state; unsigned char x_time8(unsigned char state) /乘8处理

26、state=x_time2(x_time2(x_time2(state); return state; unsigned char x_time9(unsigned char state)/乘9处理 state=statex_time8(state); return state; unsigned char x_timeB(unsigned char state)/乘B处理 state=statex_time2(state)x_time8(state); return state; unsigned char x_timeD(unsigned char state)/乘D处理 state=st

27、atex_time4(state)x_time8(state); return state; unsigned char x_timeE(unsigned char state)/乘E处理 state=x_time2(state)x_time4(state)x_time8(state); return state; void MixColumns(unsigned char state44)int i,j;unsigned char state_144;for(i=0;i4;i+)for(j=0;j4;j+) state_1ij=stateij; for(j=0;j4;j+) state0j=

28、x_time2(state_10j)x_time3(state_11j)state_12jstate_13j; state1j=state_10jx_time2(state_11j)x_time3(state_12j)state_13j; state2j=state_10jstate_11jx_time2(state_12j)x_time3(state_13j); state3j=x_time3(state_10j)state_11jstate_12jx_time2(state_13j);/逆向列混淆void Inv_MixColumns(unsigned char state44)int i

29、,j;unsigned char state_144;for(i=0;i4;i+)for(j=0;j4;j+) state_1ij=stateij; for(j=0;j4;j+) state0j=x_timeE(state_10j)x_timeB(state_11j)x_timeD(state_12j)x_time9(state_13j); state1j=x_time9(state_10j)x_timeE(state_11j)x_timeB(state_12j)x_timeD(state_13j); state2j=x_timeD(state_10j)x_time9(state_11j)x_

30、timeE(state_12j)x_timeB(state_13j); state3j=x_timeB(state_10j)x_timeD(state_11j)x_time9(state_12j)x_timeE(state_13j);int main()int i,j;unsigned char state44= 0x87,0xf2,0x4d,0x97, 0x6e,0x4c,0x90,0xec, 0x46,0xe7,0x4a,0xc3, 0xa6,0x8c,0xd8,0x95 ;MixColumns(state);printf(正向列混淆结果: n); for(i=0;i4;i+) for(j

31、=0;j4;j+) printf(%x ,stateij); printf(n); printf(n); Inv_MixColumns(state); printf(逆向列混淆结果: n); for(i=0;i4;i+) for(j=0;j4;j+) printf(%x ,stateij); printf(n); 其测试结果如下:通过比较,可知结果正确,因此该子模块实现。4.4 轮密钥加#include static unsigned char key16;static unsigned char ex_key176;static unsigned char round_key1116; st

32、atic unsigned char Sbox256 = /AES的S盒0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x

33、71, 0xd8, 0x31, 0x15,0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58,

34、 0xcf,0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,0x60, 0x8

35、1, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,0xba, 0x78, 0x25, 0x2e,

36、0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x4

37、2, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16;/秘钥扩展 void key_Expansion (unsigned char key16) int i,j,k; unsigned char temp4; /用于寄存wi-1 unsigned char t; unsigned char RC10=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36; unsigned char Rcon104=0x01,0x0,0x0,0x0, 0x02,0x0,0x0,0x0, 0x04,0x0,0

38、x0,0x0, 0x08,0x0,0x0,0x0, 0x10,0x0,0x0,0x0, 0x20,0x0,0x0,0x0, 0x40,0x0,0x0,0x0, 0x80,0x0,0x0,0x0, 0x1b,0x0,0x0,0x0, 0x36,0x0,0x0,0x0,; /轮常量 for(i=0;i16;i+) /将输入秘钥复制到扩展秘钥数组的前四个字 ex_keyi=keyi; for(i=16;i176;i+=4) /秘钥扩展 for(j=0;j4;j+) tempj=ex_keyi-4+j ; /用于寄存wi-1 if(i%16=0) /对于wi中下标为的4的倍数要使用函数g来计算 /循环

39、左移 t=temp0; for(k=0;k3;k+) tempk=tempk+1; temp3=t; /字代替 for(k=0;k4;k+) tempk=Sboxtempk; /与轮常量相异或 for(k=0;k4;k+) tempk=tempkRconi/16-1k; / 得到最后的wi,wi=wi-1wi-4 for(k=i;ki+4;k+) ex_keyk=ex_keyk-16tempk-i; /第k轮的轮密钥加 void RoundKey(unsigned char state44,int k)int i,j;for(i=0;i16;i+)round_keyki=ex_key16*k+

40、i;/第k轮的轮密钥生成 for(i=0;i4;i+) for(j=0;j4;j+) stateij=stateijround_keyk4*j+i; int main() unsigned char key16=0x0f,0x15,0x71,0xc9, 0x47,0xd9,0xe8,0x59,0x0c,0xb7,0xad,0xd6,0xaf,0x7f,0x67,0x98; unsigned char state44= 0xb9,0x94,0x57,0x75, 0xe4,0x8e,0x16,0x51, 0x47,0x20,0x9a,0x3f, 0xc5,0xd6,0xf5,0x3b ; int

41、i,j; key_Expansion(key); for(i=0;i11;i+) for(j=0;j16;j+)round_keyij=ex_key16*i+j;/第k轮的轮密钥生成 for(i=0;i11;i+) printf(第%d轮密钥:n,i); for(j=0;j16;j+) printf(%02x ,round_keyij); if(j+1)%4=0) printf(n); printf(n); RoundKey(state,1); printf(第一轮结束后的state输出:n); for(i=0;i4;i+) for(j=0;j=0x80) /判断最高位是否是1,若是,则需要约

42、化,即左移一位后,再异或1000 0111=0x87 for(i=0;i16;i+) key_1i=Li1;/左移一位 key_115=key_1150x87; else for(i=0;i16;i+)key_1i=Li=0x80) for(i=0;i16;i+) key_2i=key_1i1;/左移一位 key_215=key_2150x87; else for(i=0;i16;i+)key_2i=key_1i1;/对消息不是密文分组的整数倍,要在分组最后右边填充1及若干个0/*last_text是最后一个不完整分组,length是最后一组的长度,out_text是填充后的输出 void f

43、ill(unsigned char *last_text,int length, unsigned char out_text16) int i;for(i=0;i16;i+)if(ilength) /将原来的数填充到高位 out_texti=last_texti; else if(i=length) out_texti=0x80; else out_texti=0x00; void AES_CMAC(unsigned char Mass,unsigned char key16,int length, unsigned char mac)int i,j,n,last_l;int flag=0;

44、 /用于标记密文分组是否完整 unsigned char M_C116=0x00,M_C216, M_C_K16; /用于存放中间数据unsigned char key_116,key_216; /分组密钥unsigned char last16,Cn16; n=(length+15)/16; /用于确定分几组 last_l=length%16; k1_k2(key,key_1,key_2);if(last_l=0) flag=1; /表明是分组长度b=128的整数倍if(flag=0)fill(&Mass16*(n-1),last_l,last);/对前n-1轮 for(i=0;in-1;i+) for (j=0;j16;j+) M_C2j=M_C1jMass16*i+j; Encryption(M_C2,key,M_C1); if(flag

温馨提示

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

评论

0/150

提交评论