您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > AES加密算法实验报告
四川大学计算机学院、软件学院实验报告学号:姓名:专业:班级:第10周课程名称密码学与网络安全实验课时2实验项目AES加密算法实验时间2015.5.7实验目的完成AES加密算法,实现图片加密与解密,并将加密后的结果以图片格式保存。实验环境PC机,Windows7操作系统,VisualC++6.0实验内容(算法、程序、步骤和方法)一、简介美国国家标准技术研究所在2001年发布了高级加密标准(AES)。AES是一个对称加密算法,旨在取代DES成为广泛使用的标准。AES中的所有运算都是在8为的字节上运行的。特别饿,加减乘除算术都是在有限域GF(28)上运行的。二、程序特点本次试验中要求对图片进行加密与解密,并将加密结果以图片格式进行保存。因此为了实现对图片的调度及保存,使用头文件atlimage.h进行对图片的操作,实现对图片的像素读取,图片的保存。在程序运行读取需要加密的图片时,需要进行图片的选取,本次实验中使用在弹窗中选取文件的方式,使用头文件commdlg.h来实现在文件夹中选择需要的文件的选取。三、加密算法流程AES加密算法流程如下字节代替:用一个S盒完成分组的字节到字节的代替;行移位:进行一次行上的置换;列混合:利用有限域GF(28)上的运算特性的一个代替;轮密钥加:当前分组和扩展密钥的一部分进行按位异或。四、代码实现cryptograph.h#includestring#includeiostreamclassplaintext{public:plaintext();staticvoidcreateplaintext(unsignedchara[]);staticvoidSubBytes(unsignedcharp[16]);staticvoidinSubBytes(unsignedcharp[16]);staticvoidShiftRows(unsignedchare[]);staticvoidinShiftRows(unsignedchare[]);staticvoidMatrixToByte(unsignedchare[]);staticvoidinMatrixToByte(unsignedchare[]);staticunsignedcharFFmul(unsignedchara,unsignedcharb);staticvoidKeyAdding(unsignedcharstate[16],unsignedchark[][4]);staticvoidKeyExpansion(unsignedchar*key,unsignedcharw[][4][4]);~plaintext();private:};cryptograph.cpp#includecryptography.husingnamespacestd;staticunsignedcharsBox[]={};/定义加密S盒/unsignedcharinsBox[256]={};//定义解密S盒plaintext::plaintext(){}voidplaintext::createplaintext(unsignedchara[])//创建明文{inti=0;unsignedintp[16];for(intj=0;j200;j++){if(a[j]==0){break;}}for(;i16;i++){p[i]=a[i];a[i]=a[i+16];}}voidplaintext::SubBytes(unsignedcharp[16])//字节变换函数{unsignedcharb[16];for(inti=0;i16;i++){b[i]=sBox[(int)p[i]];}}voidplaintext::inSubBytes(unsignedcharp[16])//逆字节变换函数{unsignedcharb[16];for(inti=0;i16;i++){b[i]=insBox[(int)p[i]];}}voidplaintext::ShiftRows(unsignedchare[])//行移位变换函数{unsignedchart[4];for(inti=1;i4;i++){for(intx=0;x4;x++)t[x]=e[x+i*4];for(inty=0;y4;y++)e[(y+4-i)%4+i*4]=t[y];}}voidplaintext::inShiftRows(unsignedchare[])//逆行移位变换函数{unsignedchart[4];for(inti=1;i4;i++){for(intx=0;x4;x++)t[x]=e[x+i*4];for(inty=0;y4;y++)e[(y+i)%4+i*4]=t[y];}}voidplaintext::MatrixToByte(unsignedchare[])//列混合变换函数{unsignedchart[4];intr,c;for(c=0;c4;c++){for(r=0;r4;r++){t[r]=e[r*4+c];}for(r=0;r4;r++){e[r*4+c]=FFmul(0x02,t[r])^FFmul(0x03,t[(r+1)%4])^FFmul(0x01,t[(r+2)%4])^FFmul(0x01,t[(r+3)%4]);}}}voidplaintext::inMatrixToByte(unsignedchare[])//逆列混合变换函数{unsignedchart[4];intr,c;for(c=0;c4;c++){for(r=0;r4;r++){t[r]=e[r*4+c];}for(r=0;r4;r++){e[r*4+c]=FFmul(0x0e,t[r])^FFmul(0x0b,t[(r+1)%4])^FFmul(0x0d,t[(r+2)%4])^FFmul(0x09,t[(r+3)%4]);}}}unsignedcharplaintext::FFmul(unsignedchara,unsignedcharb){unsignedcharbw[4];unsignedcharres=0;inti;bw[0]=b;for(i=1;i4;i++){bw[i]=bw[i-1]1;if(bw[i-1]&0x80){bw[i]^=0x1b;}}for(i=0;i4;i++){if((ai)&0x01){res^=bw[i];}}returnres;}voidplaintext::KeyAdding(unsignedcharstate[16],unsignedchark[][4])//轮密钥加{intr,c;for(c=0;c4;c++){for(r=0;r4;r++){state[r+c*4]^=k[r][c];}}}voidplaintext::KeyExpansion(unsignedchar*key,unsignedcharw[][4][4])//密钥扩展{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];}}}}plaintext::~plaintext(){}main.cpp#includeiostream#includeatlimage.h#includecommdlg.h//使用文件选取功能#includecryptography.husingnamespacestd;unsignedcharw[11][4][4]={0};intlen=0;//图片每行需要加密的长度voidCipher();//加密图片voidinCipher();//解密图片voidCipher(unsignedchara[]){unsignedcharb[16];for(inti=0;i(len/16);i++){for(intj=0;j16;j++)b[j]=a[j+i*16];plaintext::KeyAdding(b,w[0]);for(intn=1;n=10;n++){plaintext::SubBytes(b);plaintext::ShiftRows(b);if(n!=10)plaintext::MatrixToByte(b);plaintext::KeyAdding(b,w[n]);}for(intm=0;m16;m++)a[m+i*16]=b[m];}}voidinCipher(unsignedchara[]){unsignedcharb[16];for(inti=0;i(len/16);i++){for(intj=0;j16;j++){b[j]=a[j+i*16];}plaintext::KeyAdding(b,w[10]);for(intn=9;n=0;n--){plaintext::inShiftRows(b);plaintext::inSubBytes(b);plaintext::KeyAdding(b,w[n]);if(n)plaintext::inMatrixToByte(b);}for(intm=0;m16;m++)a[m+i*16]=b[m];}}boolImageCopy(constCImage&srcImage,CImage&destImage){inti,j;//循环变量if(srcImage.IsNull())returnFALSE;//源图像参数BYTE*srcPtr=(BYTE*)srcImage.GetBits();intsrcBitsCount=srcImage.GetBPP();intsrcWidth=srcImage.GetWidth();intsrcHeight=srcImage.GetHeight();intsrcPitch=srcImage.GetPitch();//销毁原有图像if(!destImage.IsNull()){destImage.Destroy();}//创建新图像if(srcBitsCount==32)//支持alpha通道{destImage.Create(srcWidth,srcHeight,srcBitsCount,1);}else{destImage.Create(srcWidth,srcHeight,srcBitsCount,0);}BYTE*destPtr=(BYTE*)destImage.GetBits();intdestPitch=destImage.GetPitch();len=abs(srcPitch);for(inti=0;isrcHeight;i++)Cipher(srcPtr+i*srcPitch);//复制图像数据for(i=0;isrcHeight;i++){memcpy(destPtr+i*destPitch,srcPtr+i*srcPitch,abs(srcPitch));}returnTRUE;}boolinImageCopy(constCImage&srcImage,CImage&destImage){inti,j;//循环变量if(srcImage.IsNull())retu
本文标题:AES加密算法实验报告
链接地址:https://www.777doc.com/doc-2896416 .html