AES加密算法实验报告.docx

上传人:b****7 文档编号:15756433 上传时间:2023-07-07 格式:DOCX 页数:17 大小:1.39MB
下载 相关 举报
AES加密算法实验报告.docx_第1页
第1页 / 共17页
AES加密算法实验报告.docx_第2页
第2页 / 共17页
AES加密算法实验报告.docx_第3页
第3页 / 共17页
AES加密算法实验报告.docx_第4页
第4页 / 共17页
AES加密算法实验报告.docx_第5页
第5页 / 共17页
AES加密算法实验报告.docx_第6页
第6页 / 共17页
AES加密算法实验报告.docx_第7页
第7页 / 共17页
AES加密算法实验报告.docx_第8页
第8页 / 共17页
AES加密算法实验报告.docx_第9页
第9页 / 共17页
AES加密算法实验报告.docx_第10页
第10页 / 共17页
AES加密算法实验报告.docx_第11页
第11页 / 共17页
AES加密算法实验报告.docx_第12页
第12页 / 共17页
AES加密算法实验报告.docx_第13页
第13页 / 共17页
AES加密算法实验报告.docx_第14页
第14页 / 共17页
AES加密算法实验报告.docx_第15页
第15页 / 共17页
AES加密算法实验报告.docx_第16页
第16页 / 共17页
AES加密算法实验报告.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

AES加密算法实验报告.docx

《AES加密算法实验报告.docx》由会员分享,可在线阅读,更多相关《AES加密算法实验报告.docx(17页珍藏版)》请在冰点文库上搜索。

AES加密算法实验报告.docx

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

#include

#include

classplaintext

{

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

#include"cryptography.h"

usingnamespacestd;

staticunsignedcharsBox[]={};/定义加密S盒/

unsignedcharinsBox[256]={};//定义解密S盒

plaintext:

:

plaintext()

{

}

voidplaintext:

:

createplaintext(unsignedchara[])//创建明文

{

inti=0;

unsignedintp[16];

for(intj=0;j<200;j++)

{

if(a[j]==0)

{

break;

}

}

for(;i<16;i++)

{

p[i]=a[i];

a[i]=a[i+16];

}

 

}

voidplaintext:

:

SubBytes(unsignedcharp[16])//字节变换函数

{

unsignedcharb[16];

for(inti=0;i<16;i++)

{

b[i]=sBox[(int)p[i]];

}

}

voidplaintext:

:

inSubBytes(unsignedcharp[16])//逆字节变换函数

{

unsignedcharb[16];

for(inti=0;i<16;i++)

{

b[i]=insBox[(int)p[i]];

}

}

voidplaintext:

:

ShiftRows(unsignedchare[])//行移位变换函数

{

unsignedchart[4];

for(inti=1;i<4;i++)

{

for(intx=0;x<4;x++)

t[x]=e[x+i*4];

for(inty=0;y<4;y++)

e[(y+4-i)%4+i*4]=t[y];

}

}

voidplaintext:

:

inShiftRows(unsignedchare[])//逆行移位变换函数

{

unsignedchart[4];

for(inti=1;i<4;i++)

{

for(intx=0;x<4;x++)

t[x]=e[x+i*4];

for(inty=0;y<4;y++)

e[(y+i)%4+i*4]=t[y];

}

}

voidplaintext:

:

MatrixToByte(unsignedchare[])//列混合变换函数

{

unsignedchart[4];

intr,c;

for(c=0;c<4;c++)

{

for(r=0;r<4;r++)

{

t[r]=e[r*4+c];

}

for(r=0;r<4;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;c<4;c++)

{

for(r=0;r<4;r++)

{

t[r]=e[r*4+c];

}

for(r=0;r<4;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;i<4;i++)

{

bw[i]=bw[i-1]<<1;

if(bw[i-1]&0x80)

{

bw[i]^=0x1b;

}

}

for(i=0;i<4;i++)

{

if((a>>i)&0x01)

{

res^=bw[i];

}

}

returnres;

}

voidplaintext:

:

KeyAdding(unsignedcharstate[16],unsignedchark[][4])//轮密钥加

{

intr,c;

for(c=0;c<4;c++)

{

for(r=0;r<4;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;r<4;r++)

{

for(c=0;c<4;c++)

{

w[0][r][c]=key[r+c*4];

}

}

for(i=1;i<=10;i++)

{

for(j=0;j<4;j++)

{

unsignedchart[4];

for(r=0;r<4;r++)

{

t[r]=j?

w[i][r][j-1]:

w[i-1][r][3];

}

if(j==0)

{

unsignedchartemp=t[0];

for(r=0;r<3;r++)

{

t[r]=sBox[t[(r+1)%4]];

}

t[3]=sBox[temp];

t[0]^=rc[i-1];

}

for(r=0;r<4;r++)

{

w[i][r][j]=w[i-1][r][j]^t[r];

}

}

}

}

plaintext:

:

~plaintext()

{

}

main.cpp

#include

#include

#include//使用文件选取功能

#include"cryptography.h"

usingnamespacestd;

unsignedcharw[11][4][4]={0};

intlen=0;//图片每行需要加密的长度

voidCipher();//加密图片

voidinCipher();//解密图片

voidCipher(unsignedchara[])

{

unsignedcharb[16];

for(inti=0;i<(len/16);i++)

{

for(intj=0;j<16;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;m<16;m++)

a[m+i*16]=b[m];

}

}

voidinCipher(unsignedchara[]){

unsignedcharb[16];

for(inti=0;i<(len/16);i++)

{

for(intj=0;j<16;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;m<16;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;i

Cipher(srcPtr+i*srcPitch);

//复制图像数据

for(i=0;i

{

memcpy(destPtr+i*destPitch,srcPtr+i*srcPitch,abs(srcPitch));

}

returnTRUE;

}

boolinImageCopy(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;i

inCipher(srcPtr+i*srcPitch);

//复制图像数据

for(i=0;i

{

memcpy(destPtr+i*destPitch,srcPtr+i*srcPitch,abs(srcPitch));

}

returnTRUE;

}

intmain()

{

unsignedcharkey[16]={//固定密钥

0x77,0x59,0xc5,0xa4,

0x55,0x90,0xa4,0xa3,

0xb2,0xcc,0x01,0xa9,

0xcb,0xac,0x77,0x23};

plaintext:

:

KeyExpansion(key,w);

TCHARszBuffer[MAX_PATH]={0};//使用文件选取功能

OPENFILENAMEofn={0};

ofn.lStructSize=sizeof(ofn);

//ofn.hwndOwner=m_hWnd;

ofn.lpstrFilter=_T("");//要选择的文件后缀

ofn.lpstrInitialDir=_T("D:

\\");//默认的文件路径

ofn.lpstrFile=szBuffer;//存放文件的缓冲区

ofn.nMaxFile=sizeof(szBuffer)/sizeof(*szBuffer);

ofn.nFilterIndex=0;

ofn.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER;//标志如果是多选要加上OFN_ALLOWMULTISELECT

BOOLbSel=GetOpenFileName(&ofn);

CImageimage,image2,image3;//读取图片

image.Load(szBuffer);

ImageCopy(image,image2);

image2.Save("e:

/encryption.jpg");

inImageCopy(image2,image3);

image3.Save("e:

/reencryption.jpg");

system("pause");

}

本数据记录

和计算

运行程序,出现选择图片界面

加密结束

原图片加密图片解密图片

结论

(结果)

 

根据结果显示,程序成功的实现了对图片的加密,得到的加密后的结果仍然为图片,并成功地的解密得到了正确的解密后的图片。

 

小结

 

通过本次试验,成功的完成了对AES密码算法的初步编写,了解了AES算法的工作原理。

对于图片加密方面,掌握了新的调用图片的方法,使用头文件atlimage.h大大简化了c++中对图片调用的难度。

同时在文件读取方面使用了头文件commdlg.h,使得程序在使用上更加方便。

 

指导老师评议

 

 

成绩评定:

指导教师签名:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2