《AES-与基于AES-的CMAC》由会员分享,可在线阅读,更多相关《AES-与基于AES-的CMAC(21页珍藏版)》请在金锄头文库上搜索。
1、 本科实验报告课程名称:信息与通信安全姓 名:邓敏 实 验:实验一系:信电系专 业:信息与通信工程学 号:指引教师:谢磊 年 月 日 AES 与基于AE 的CMAC一、 实验目的1、熟悉ES加解密过程,掌握其算法实现;2、熟悉AC生成过程,掌握其算法实现。二、 实验任务 1、复习S 原理; 2、用+ 编写AE 算法并调试通过; 3、复习CMAC 原理; 4、在实现AS 基本上,用C/C+ 编写CMA算法并调试通过。三、 实验原理1.AES原理 AES加解密过程如下图所示,明文分组的长度为18位即1字节,秘钥长度可觉得,24或32字节(18,8或256位)。根据秘钥的长度,算法被称为S-128、
2、ES92、或AES-6,本次实验采用AES128。1加密过程k0k8k12k159k13k26k04k3k11k1AE明文输入为一种1位分组,在代码实现中被描述为4的字节方阵,一般称其为tae数组,并且按照如下方式填入到数组当中,原始密钥也为128为分组,并按同样的方式填入数组。in4iin12iin5in9in3in2inn10i14n3n7in11in1AS加密过程共进行十轮,前九轮由四个环节构成,四个环节依次为字节替代(SubBts),行移位(ShifRows),列混淆(Column),轮密钥加(AdRounKey),第十轮依次进行除列混淆的三个环节。1.1.1字节替代AES定义了一种S
3、盒,它是由1x1个字节构成的矩阵,涉及了8位所能表达的256个数的一种置换,字节替代将输入字节的高四位作为行值,低四位作为列值,以这些行列值作为索引从S盒的相应位置取出元素作为输入。112行移位变换 行移位变换完毕基于行的循环移位操作,state的第行不动,第1行循环左移1个字节,第2行循环左移个字节,第3行循环左移3个字节。 1.3列混淆列混淆变换的正向列混淆变换对每列独立地进行操作。每列中的每个字节被映射为一种新值,此值由该列中的四个字节通过函数变换得到,这个变换可由下面基于sa的矩阵乘法表达。状态中单列的列混淆变换可表达为1.1.4轮密钥加 轮密钥加变换用于将输入或中间态S的每一列与一种
4、密钥字i进行按位异或,其中, Wi由原始密钥通过密钥扩展算法产生。1S解密过程AES解密过程为加密过程的逆,同为十轮,四个环节按一定顺序执行,四个环节分别为逆向字节替代(Ivuytes),逆向行移位(nvSitRows),逆向列混淆(InvMixColmn),轮密钥加(AddRondey),其中轮密钥加与加密过程中的环节相似。1.1逆向字节替代 AES定义了一种逆盒,其替代措施与加密过程相似12逆向行移位 逆向行移位与行移位变换相反,逆行移位变换将态Stte的后三行按相反的方向进行移位操作,即第0行保持不变,第1行向右移1个字节,第行向右移2个字节,第行向右移3个字节。1.2.2逆向列混淆逆列
5、混淆变换的解决措施与列混淆变换类似,每一列都通过与一种固定的多项相乘进行变换。 写为矩阵乘法的形式,逆列混淆变换按如下方式对列进行变换:1.AS秘钥扩展AES加密解密过程中,每一轮都需要一种与输入分组具有相似长度的扩展密钥W的参与。由于外部输入的加密密钥长度有限,因此在算法中要用一种密钥扩展程序把外部密钥扩展成更长的比特串,以生成各轮的加密和解密密钥。其一轮过程如下图所示,一共需要进行十次,由原密钥扩展出1个密钥,分别用于每轮加解密。其中函数为行移位,自己替代以及与轮常量异或。2. M原理CMC为基于密码的消息认证码,生成认证码的过程课分为两种。一方面,当消息长度是分组长度b的n倍时,在此我们
6、选择b=128,可将消息换分为n组(M1,M.Mn)。算法使用了k位的加密密钥K和n位的常数1对于AES,密钥长度k为2、12或256位,在此我们选择12位,CMAC按如下方式计算 其中,T为消息认证码,也成为ag;Tle是T的位长度,是位串的X最左边的s位。如果消息不是密文分组长度的整数倍时,则最后分组的右边(低有效位)填充一种1和若干使得最后的分组长度为b。除了使用一种不同的位密钥K替代K1外,和前面所述的同样进行CMA运算。两个n位的密钥由位的加密密钥按如下方式导出: 其中乘法(*)在域GF(2)内进行。四、 ES模块代码实现1、 字节替代 tate值由1进制表达,因此taterc=1i
7、j,为高四位,j为低位,s盒为16x6矩阵,因此只需用statrc = sboat即可完毕字节替代。其实现代码如下:vi Suyts(usignchartate44)itr,c;or(=0; ;r+)or(c0;4; c)taterc soxstaerc;2、 行移位 代码实现时,一行一行的完毕,由于第一行不变,因此行移位由r开始到r3,定义一种中间数组变量存储移位后改行每列的值,变换可由tc stat(c+r)%实现,例如当r=1,c=1,1=stt2,r=1,c=,3stte,即完毕了第一行的移位,然后再将tc赋值回statec即可。模块代码实现如下:vd hiftRow(usignedc
8、har st4)unsinedhar;nr,c;or(r1; r; r+)for(c=0; 4; +)tc =state(c+r)%4;for(c=; 4; +)satec = tc;3、 列混淆 列混淆实现时,一列一列的进行,由原理可知,每个列混淆之后的元素都与该列的四个元素有关,因此定义一种中间变量r存储原tat值避免之后给state赋值时将原值覆盖,由列混淆原理,可总结出ste列混淆之后每个元素的值为statec Ful(0x2, tr) FFmul(03,t(r+1)4)FFml(0x01, t(r2)4) Ful(0x0, t(r+3)%),其中FFmul为定义在GF(28)上的乘法
9、,其元算原理为将某值x乘以2其成果左移觉得,若该值的最左边的位为1,那么在移位后还要异或(000 10),而x乘以3即为x*03=02x,x乘以0E090D0B也可按相似方式实现,因此可以写出FFml代码。vid Mixolums(unnedchrsate4)uigd char t4;int r,;fo(=0; c 4;c+)r(=0; r4; r+)tr = tat;for(r=0; r; r+)statc = Fu(00, tr) Fmul(0x03, t(r+1)%4) Fmul(x01, (+2)%4) FFml(01, t(r+3)%);usigned cr mul(unignd a
10、r a, usgnd cr )unsincha bw;unsigned r es0;n i;b0=b;fr(i=;i4; i+)bwi bw-11;if(wi-1&0x80)bwx;fr(=0;ii)&x01)rs bw;rur res;4、 轮密钥加 轮密钥加即将state值与相应的ky值相异或后再赋回tt,因此只需用ttec=kr即可实现。模块代码实现如下:void ddounKe(unined ch stt4,unsgnedha k)int r,c;o(c=;c4; c+)for(; r4;r+)statrc= krc;5、 逆字节替代逆字节替代与字节替代代码实现基本相似,指需将s盒换位
11、逆盒Insbx即可。模块代码实现如下:vid InSubBytes(unsned charstate)intr,c;or(r=; r4; r+)for(0;c4;+)sater = vsoxsrc;6、 逆向行移位逆向行移位代码实现与行移位代码实现也基本相似,行移位为向左移,而逆向行移位为向右移,可由c = state(c-r+4)%实现。模块代码实现如下:voidIvhifRws(uns r te4)nigned chr t4;n r,c;o(r=; r4;r+)r(=; c4;c+)tc saer(c-r+4)%;for(c0;4; c+)satec t;7、 逆向列混淆逆向列混淆代码实现与列混淆基本相似,只需将相乘的矩阵变换一下即可,化成单列表达时,只需将各元素之前的系数变化即可,staterc = Fmul(x0e, ) Fmul(x0b,t(r+1)%4) FFml(0x0d, (r2)4) mu(x09, t(r+3)%4),而Ful模块之前已经简介过了。模块代码实现如下:vodInvMixCo