AES-与基于AES-的CMAC.doc_第1页
AES-与基于AES-的CMAC.doc_第2页
AES-与基于AES-的CMAC.doc_第3页
AES-与基于AES-的CMAC.doc_第4页
AES-与基于AES-的CMAC.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

本科实验报告课程名称:信息与通信安全姓 名:邓敏 实 验:实验一系:信电系专 业:信息与通信工程学 号:3110100978指导教师:谢磊 年 月 日 AES 与基于AES 的CMAC1、 实验目的1、熟悉AES加解密过程,掌握其算法实现;2、熟悉CMAC生成过程,掌握其算法实现。2、 实验任务 1、复习AES 原理; 2、用C/C+ 编写AES 算法并调试通过; 3、复习CMAC 原理; 4、在实现 AES 基础上,用C/C+ 编写CMAC 算法并调试通过。3、 实验原理1.AES原理 AES加解密过程如下图所示,明文分组的长度为128位即16字节,秘钥长度可以为16,24或32字节(128,182或256位)。根据秘钥的长度,算法被称为AES-128、AES-192、或AES-256,本次实验采用AES-128。1.1AES加密过程k0k4k8k12k1k5k9k13k2k6k10k14k3k7k11k15AES明文输入为一个128位分组,在代码实现中被描述为4x4的字节方阵,一般称其为state数组,并且按照如下方式填入到数组当中,原始密钥也为128为分组,并按同样的方式填入数组。in0in4in8in12in1in5in9in13in2in6in10in14in3in7in11in15AES加密过程共进行十轮,前九轮由四个步骤组成,四个步骤依次为字节代替(SubBytes),行移位(ShiftRows),列混淆(MixColumns),轮密钥加(AddRoundKey),第十轮依次进行除列混淆的三个步骤。1.1.1字节代替AES定义了一个S盒,它是由16x16个字节组成的矩阵,包含了8位所能表示的256个数的一个置换,字节代替将输入字节的高四位作为行值,低四位作为列值,以这些行列值作为索引从S盒的对应位置取出元素作为输入。1.1.2行移位变换 行移位变换完成基于行的循环移位操作,state的第0行不动,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。 1.1.3列混淆列混淆变换的正向列混淆变换对每列独立地进行操作。每列中的每个字节被映射为一个新值,此值由该列中的四个字节通过函数变换得到,这个变换可由下面基于state的矩阵乘法表示。状态中单列的列混淆变换可表示为1.1.4轮密钥加 轮密钥加变换用于将输入或中间态S的每一列与一个密钥字Wi进行按位异或,其中, Wi由原始密钥通过密钥扩展算法产生。1.2AES解密过程AES解密过程为加密过程的逆,同为十轮,四个步骤按一定顺序执行,四个步骤分别为逆向字节替代(InvSubBytes),逆向行移位(InvShiftRows),逆向列混淆(InvMixColumns),轮密钥加(AddRoundKey),其中轮密钥加与加密过程中的步骤相同。1.2.1逆向字节替代 AES定义了一个逆S盒,其替代方法与加密过程相同1.2.2逆向行移位 逆向行移位与行移位变换相反,逆行移位变换将态State的后三行按相反的方向进行移位操作,即第0行保持不变,第1行向右移1个字节,第2行向右移2个字节,第3行向右移3个字节。1.2.2逆向列混淆逆列混淆变换的处理方法与列混淆变换类似,每一列都通过与一个固定的多项相乘进行变换。 写为矩阵乘法的形式,逆列混淆变换按以下方式对列进行变换:1.3AES秘钥扩展AES加密解密过程中,每一轮都需要一个与输入分组具有相同长度的扩展密钥Wi的参与。由于外部输入的加密密钥长度有限,所以在算法中要用一个密钥扩展程序把外部密钥扩展成更长的比特串,以生成各轮的加密和解密密钥。其一轮过程如下图所示,一共需要进行十次,由原密钥扩展出10个密钥,分别用于每轮加解密。其中g函数为行移位,自己替代以及与轮常量异或。2. CMAC原理CMAC为基于密码的消息认证码,生成认证码的过程课分为两种。首先,当消息长度是分组长度b的n倍时,在此我们选择b=128,可将消息换分为n组(M1,M2.Mn)。算法使用了k位的加密密钥K和n位的常数K1.对于AES,密钥长度k为128、192或256位,在此我们选择128位,CMAC按如下方式计算 其中,T为消息认证码,也成为tag;Tlen是T的位长度,是位串的X最左边的s位。如果消息不是密文分组长度的整数倍时,则最后分组的右边(低有效位)填充一个1和若干0使得最后的分组长度为b。除了使用一个不同的n位密钥K2代替K1外,和前面所述的一样进行CMAC运算。两个n位的密钥由K位的加密密钥按如下方式导出: 其中乘法(*)在域GF(2n)内进行。4、 AES模块代码实现1、 字节替代 state值由16进制表示,因此staterc=16i+j,i为高四位,j为低4位,s盒为16x16矩阵,因此只需用staterc = sboxstaterc即可完成字节替代。其实现代码如下:void SubBytes(unsigned char state44)int r,c;for(r=0; r4; r+)for(c=0; c4; c+)staterc = sboxstaterc;2、 行移位 代码实现时,一行一行的完成,因为第一行不变,因此行移位由r=1开始到r=3,定义一个中间数组变量存储移位后改行每列的值,变换可由tc = stater(c+r)%4实现,例如当r=1,c=1,t1=state2,r=1,c=3,t3=state0,即完成了第一行的移位,然后再将tc赋值回staterc即可。模块代码实现如下:void ShiftRows(unsigned char state4)unsigned char t4;int r,c;for(r=1; r4; r+)for(c=0; c4; c+)tc = stater(c+r)%4;for(c=0; c4; c+)staterc = tc;3、 列混淆 列混淆实现时,一列一列的进行,由原理可知,每个列混淆之后的元素都与该列的四个元素有关,因此定义一个中间变量tr存储原state值防止之后给state赋值时将原值覆盖,由列混淆原理,可总结出state列混淆之后每个元素的值为staterc = FFmul(0x02, tr) FFmul(0x03, t(r+1)%4) FFmul(0x01, t(r+2)%4) FFmul(0x01, t(r+3)%4),其中FFmul为定义在GF(28)上的乘法,其元算原理为将某值x乘以2其结果左移以为,若该值的最左边的位为1,那么在移位后还要异或(0001 1001),而x乘以3即为x*03=x*02x,x乘以0E090D0B也可按相同方式实现,因此可以写出FFmul代码。void MixColumns(unsigned char state4)unsigned char t4;int r,c;for(c=0; c 4; c+)for(r=0; r4; r+)tr = staterc;for(r=0; r4; r+)staterc = FFmul(0x02, tr) FFmul(0x03, t(r+1)%4) FFmul(0x01, t(r+2)%4) FFmul(0x01, t(r+3)%4);unsigned char FFmul(unsigned char a, unsigned char b)unsigned char bw4;unsigned char res=0;int i;bw0 = b;for(i=1; i4; i+)bwi = bwi-11;if(bwi-1&0x80)bwi=0x1b;for(i=0; ii)&0x01)res = bwi;return res;4、 轮密钥加 轮密钥加即将state值与相应的key值相异或后再赋回state,因此只需用staterc = krc即可实现。模块代码实现如下:void AddRoundKey(unsigned char state4, unsigned char k4)int r,c;for(c=0; c4; c+)for(r=0; r4; r+)staterc = krc;5、 逆字节替代逆字节替代与字节替代代码实现基本相同,指需将s盒换位逆s盒Invsbox即可。模块代码实现如下:void InvSubBytes(unsigned char state4)int r,c;for(r=0; r4; r+)for(c=0; c4; c+)staterc = Invsboxstaterc;6、 逆向行移位逆向行移位代码实现与行移位代码实现也基本相同,行移位为向左移,而逆向行移位为向右移,可由tc = stater(c-r+4)%4实现。模块代码实现如下:void InvShiftRows(unsigned char state4)unsigned char t4;int r,c;for(r=1; r4; r+)for(c=0; c4; c+)tc = stater(c-r+4)%4;for(c=0; c4; c+)staterc = tc;7、 逆向列混淆逆向列混淆代码实现与列混淆基本相同,只需将相乘的矩阵变换一下即可,化成单列表示时,只需将各元素之前的系数改变即可,staterc = FFmul(0x0e, tr) FFmul(0x0b, t(r+1)%4) FFmul(0x0d, t(r+2)%4) FFmul(0x09, t(r+3)%4),而FFmul模块之前已经介绍过了。模块代码实现如下:void InvMixColumns(unsigned char state4)unsigned char t4;int r,c;for(c=0; c 4; c+)for(r=0; r4; r+)tr = staterc;for(r=0; r4; r+)staterc = FFmul(0x0e, tr) FFmul(0x0b, t(r+1)%4) FFmul(0x0d, t(r+2)%4) FFmul(0x09, t(r+3)%4);8、 密钥扩展密钥扩展共生成11个轮密钥w0w10。A.w0为原始输入密钥,可由代码w0rc = keyr+c*4实现;B.之后各轮密钥由前一密钥生成,首先将前一轮密钥第四列进行g函数变换;C. g函数可由如下步骤实现a.将第四列四个元素循环左移一位;b.将循环移位后所得数组进行s盒字节替代,这两步可由tr = sboxtemp(r+1)%4实现; 其中temp数组存储前一轮密钥第三列元素值,t数组为定义中间变量数组; c将t与轮常量相异或,轮常量只有最高字节有值,其余为0,可由t0 = rci-1实现; D.tr与前一轮密钥第一列相异或得到该轮密钥第一列,由wir0 = wi-1r0 tr实现;E.该轮第24列密钥由前一轮对应列密钥与该轮前一列密钥异或得到,可由wirj = wi-1rj wirj-1实现。for(r=0; r4; r+)for(c=0; c4; c+)w0rc = keyr+c*4;for(i=1; i=10; i+)unsigned char t4; unsigned char temp4;for(r=0; r4; r+)tempr = wi-1r3;for(r=0; r4; r+)tr = sboxtemp(r+1)%4;t0 = rci-1;for(r=0; r4; r+)wir0 = wi-1r0 tr;for(j=1;j4;j+)for(r=0; r4; r+) wirj = wi-1rj wirj-1;9. 加密 加密过程首先进行一轮轮密钥加,之后进行十轮的变换,每次变换分为字节替代,行移位,列混淆,轮密钥加,其中第十轮变换不进行列混淆。代码实现如下:AddRoundKey(state,w0);for(i=1; i=0; i-)InvShiftRows(state);InvSubBytes(state);AddRoundKey(state, wi);if(i)InvMixColumns(state);5、 CMAC模块代码实现1. K1、K2生成由CMAC生成原理可知道K1、K2的生成过程a. ,用AES加密,由AES_128(key,Z,L)实现,L定义为输出;b. K1=L*x,乘法定义在GF(2n),即将L左移一位,若L最高位为1,则将L左移一位之后再与const_Rb(常量)异或,左移由函数leftshift_onebit(L,K1)实现,K1定义为输出。c. K2=L*x2=K1*x,因此将L换位K1,重复进行b中操作即可得到K2。void generate_subkey(unsigned char *key, unsigned char *K1, unsigned char *K2) unsigned char L16; unsigned char Z16; unsigned char tmp16; int i; for ( i=0; i16; i+ ) Zi = 0; AES_128(key,Z,L); if ( (L0 & 0x80) = 0 ) leftshift_onebit(L,K1); else leftshift_onebit(L,tmp); xor_128(tmp,const_Rb,K1); if ( (K10 & 0x80) = 0 ) leftshift_onebit(K1,K2); else leftshift_onebit(K1,tmp); xor_128(tmp,const_Rb,K2); return; K1、K2生成时运用了左移一位函数,因为input,为16为数组,因此左移时应考虑溢出,当前一数组元素最高位为1时,则此时数组元素应在左移的同时加1,因此定义overflow,当前一元素最高位为1时,即inputi & 0x80=1,则overflow=1,否则为0,当前元素先左移一位 outputi = inputi =0; i- ) outputi = inputi 1; outputi |= overflow; overflow = (inputi & 0x80)?1:0; return; 2. 消息末组确定 当消息长度不是分组长度整数倍时,最后一组消息分组需要进行一些变换,因此需要一个函数来确定最后一组消息分组,这个函数定义为padding ( unsigned char *lastb, unsigned char *pad, int length ),其中lastb为消息分组后剩下不能成为一组的元素,length为lastb的元素个数,pad定义为输出,为最后一组消息分组。当padj中jlength时,padj=lastbj,而当j达到length长度时,padlength=0x80,其余为0,代码实现如下: void padding ( unsigned char *lastb, unsigned char *pad, int length ) int j; for ( j=0; j16; j+ ) if ( j length ) padj = lastbj; else if ( j = length ) padj = 0x80; else padj = 0x00; 3. CMAC生成CMAC有函数AES_CMAC ( unsigned char *key, unsigned char *input, int length, unsigned char *mac )生成,key为密钥,input为消息输入,length为消息长度,而mac则为生成的CMAC,在此算法中,将消息分组长度设置为16.a. 生成K1,K2,由generate_subkey(key,K1,K2)实现;b. 确定分组长度,由n = (length+15) / 16实现,当length16时,n=1;c. 确定消息长度是否为分组长度的整数倍,定义flag,当flag=1时,是整数倍,否则不是,当length=0时,即输入消息为0时,定义分组数n=1,flag=0;d. 当flag=1,即消息长度为分组长度整数倍时,定义M_last为最后分组&input16*(n-1) 与K1异或,由函数xor_128(&input16*(n-1),K1,M_last)实现,注意&的使用;e. 当flag=0时,先由padding(&input16*(n-1),padded,length%16)确定最后分组,length%16即为未分组元素个数,padded为最后分组,M_last为最后分组padded与K2异或,由函数xor_128(padded,K2,M_last)实现;f. 定义中间变量X为AES加密输出,第一组运算时为M1直接与K加密,其后为前一组加密输出X与Mi异或后再与K进行AES加密,因此第一次时定义X=0x00,则前n-1轮可由xor_128(X,&input16*i,Y),AES_128(key,Y,X)两步实现;g.最后一步加密与之前都不一样,用第n-1轮加密输出X与M_last异或,再与K进行AES加密,其中M_last先前已定义,因此最后一步运算为xor_128(X,M_last,Y),AES_128(key,Y,X)h.最后一步运算为MSB(Tlen),其中Tlen为输出CMAC即T的长度,在此我们都定义为16,而MSB运算即为截取X最左边的Tlen=16位,可由maci = Xi实现。void AES_CMAC ( unsigned char *key, unsigned char *input, int length, unsigned char *mac ) unsigned char X16,Y16, M_last16, padded16; unsigned char K116, K216; int n, i, flag; generate_subkey(key,K1,K2); n = (length+15) / 16; if ( n = 0 ) n = 1; flag = 0; else if ( (length%16) = 0 ) flag = 1; else flag = 0; if ( flag ) xor_128(&input16*(n-1),K1,M_last); else padding(&input

温馨提示

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

评论

0/150

提交评论