您好,欢迎访问三七文档
实验报告姓名:XXXXXXX学号:XXXXXXXXXX班级:XXXXXXXXX日期:2013/12/*题目:AES算法实验一、实验环境1.硬件配置:处理器:Inter(R)Core(TM)i5-2430MCPU@2.40GHz(4CPUs),~2.4GHz内存:2048MBRAM2.使用软件:(1)操作系统:win7旗舰版(2)软件工具:MicrosoftVisualc++6.0二、实验涉及的相关概念或基本原理AES是一个新的可以用于保护电子数据的加密算法。明确地说,AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations)和替换(substitutions)输入数据。Figure1显示了AES用192位密钥对一个16位字节数据块进行加密和解密的情形。对称密码算法根据对明文消息加密方式的不同可分为两大类,即分组密码和流密码。分组密码将消息分为固定长度的分组,输出的密文分组通常与输入的明文分组长度相同。AES算法属于分组密码算法,它的输入分组、输出分组以及加/解密过程中的中间分组都是128比特。密钥的长度K为128,192或256比特。用Nk=4,6,8代表密钥串的字数(1字=32比特),在本文编制的程序中由用户选定。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系见表1)。每一轮都需要一个和输入分组具有同样长度(128比特)的扩展密钥Ke的参与。由于外部输入的加密密钥K长度有限,所以在AES中要用一个密钥扩展程序(KeyExpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密密钥。(1)加密变换设X是AES的128比特明文输入,Y是128比特的密文输出,则AES密文Y可以用下面的复合变换表示:Y=AR・AC・S・…C・S・k(r+1)・S・kr・R・Ak(r21)其中”“・表示复合运算。这里Aki:表示对X的一个变换Aki(X)=XKi(Ki为第i轮的子密钥,为比特串的异或运算)。S:S盒置换。即对每一个字节用S2Box做一个置换。S2Box是一个给定的转换表。R:行置换。C:列置(换。s′x)=a(x)s(x)解密变换是加密变换的逆变换。三、实验内容AES是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。1.1圈变化AES每一个圈变换由以下三个层组成:非线性层——进行Subbyte变换;线行混合层——进行ShiftRow和MixColumn运算;密钥加层——进行AddRoundKey运算。①Subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的S盒进行映射。②ShiftRow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据Nb的不同而选择的[3]。③在MixColumn变换中,把状态中的每一列看作GF(28)上的多项式a(x)与固定多项式c(x)相乘的结果。b(x)=c(x)*a(x)的系数这样计算:*运算不是普通的乘法运算,而是特殊的运算,即b(x)=c(x)·a(x)(modx4+1)对于这个运算b0=02。a0+03。a1+a2+a3令xtime(a0)=02。a0其中,符号“。”表示模一个八次不可约多项式的同余乘法[3]。对于逆变化,其矩阵C要改变成相应的D,即b(x)=d(x)*a(x)。④密钥加层运算(addround)是将圈密钥状态中的对应字节按位“异或”。⑤根据线性变化的性质[1],解密运算是加密变化的逆变化。这里不再详细叙述。1.2轮变化对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。1.3密钥扩展AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。它涉及如下三个模块:①位置变换(rotword)——把一个4字节的序列[A,B,C,D]变化成[B,C,D,A];②S盒变换(subword)——对一个4字节进行S盒代替;③变换Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。这里的x是(02),如Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的“异或”,即W[[i]]=W[[i-1]]W[[i-Nk]]。但是若i为Nk的倍数,则W[i]=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。流程图:主要代码:①unsignedchar*AES::Cipher(unsignedchar*input){unsignedcharstate[4][4];inti,r,c;for(r=0;r4;r++){for(c=0;c4;c++){state[r][c]=input[c*4+r];}}AddRoundKey(state,w[0]);for(i=1;i=10;i++){SubBytes(state);ShiftRows(state);if(i!=10)MixColumns(state);AddRoundKey(state,w[i]);}for(r=0;r4;r++){for(c=0;c4;c++){input[c*4+r]=state[r][c];}}returninput;}unsignedchar*AES::InvCipher(unsignedchar*input){unsignedcharstate[4][4];inti,r,c;for(r=0;r4;r++){for(c=0;c4;c++){state[r][c]=input[c*4+r];}}AddRoundKey(state,w[10]);for(i=9;i=0;i--){InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,w[i]);if(i){InvMixColumns(state);}}for(r=0;r4;r++){for(c=0;c4;c++){input[c*4+r]=state[r][c];}}②unsignedchar*in=(unsignedchar*)input;inti;if(!length){while(*(in+length++));in=(unsignedchar*)input;}for(i=0;ilength;i+=16){Cipher(in+i);}returninput;③unsignedchar*in=(unsignedchar*)input;inti;for(i=0;ilength;i+=16){InvCipher(in+i);}④inti,j,r,c;unsignedcharrc[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};for(r=0;r4;r++){for(c=0;c4;c++){w[0][r][c]=key[r+c*4];}}for(i=1;i=10;i++){for(j=0;j4;j++){unsignedchart[4];for(r=0;r4;r++){t[r]=j?w[i][r][j-1]:w[i-1][r][3];}if(j==0){unsignedchartemp=t[0];for(r=0;r3;r++){t[r]=Sbox[t[(r+1)%4]];}t[3]=Sbox[temp];t[0]^=rc[i-1];}for(r=0;r4;r++){w[i][r][j]=w[i-1][r][j]^t[r];}}}⑤intr,c;for(r=0;r4;r++){for(c=0;c4;c++){state[r][c]=Sbox[state[r][c]];}}⑥unsignedchart[4];intr,c;for(r=1;r4;r++){for(c=0;c4;c++){t[c]=state[r][(c+r)%4];}for(c=0;c4;c++){state[r][c]=t[c];}}⑦voidAES::AddRoundKey(unsignedcharstate[][4],unsignedchark[][4]){intr,c;for(c=0;c4;c++){for(r=0;r4;r++){state[r][c]^=k[r][c];}}}voidAES::InvSubBytes(unsignedcharstate[][4]){intr,c;for(r=0;r4;r++){for(c=0;c4;c++){state[r][c]=InvSbox[state[r][c]];}}}voidAES::InvShiftRows(unsignedcharstate[][4]){unsignedchart[4];intr,c;for(r=1;r4;r++){for(c=0;c4;c++){t[c]=state[r][(c-r+4)%4];}for(c=0;c4;c++){state[r][c]=t[c];}}}voidAES::InvMixColumns(unsignedcharstate[][4]){unsignedchart[4];intr,c;for(c=0;c4;c++){for(r=0;r4;r++){t[r]=state[r][c];}for(r=0;r4;r++){state[r][c]=FFmul(0x0e,t[r])^FFmul(0x0b,t[(r+1)%4])^FFmul(0x0d,t[(r+2)%4])^FFmul(0x09,t[(r+3)%4]);}}四、实验总结分析心得体会AES加密算法是前辈们付出很多才有的知识。在短时间的学习过程中我也只是了解了加解密的具体流程,而对于为什么要进行这种操作的思考就显得很浅显,所以还要多花一点时间去更深层次的研究本质思想。希望在以后的学习实践中,能够有更多的收获。
本文标题:AES算法实验报告
链接地址:https://www.777doc.com/doc-8637867 .html