AES加密算法实验报告Word文档格式.docx
- 文档编号:21949488
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:17
- 大小:895.40KB
AES加密算法实验报告Word文档格式.docx
《AES加密算法实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《AES加密算法实验报告Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
三、加密算法流程
AES加密算法流程如下
字节代替:
用一个S盒完成分组的字节到字节的代替;
行移位:
进行一次行上的置换;
列混合:
利用有限域GF(28)上的运算特性的一个代替;
轮密钥加:
当前分组和扩展密钥的一部分进行按位异或。
四、代码实现
#include<
string>
iostream>
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:
};
#include"
"
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];
SubBytes(unsignedcharp[16])//字节变换函数
unsignedcharb[16];
for(inti=0;
b[i]=sBox[(int)p[i]];
inSubBytes(unsignedcharp[16])//逆字节变换函数
b[i]=insBox[(int)p[i]];
ShiftRows(unsignedchare[])//行移位变换函数
unsignedchart[4];
for(inti=1;
4;
for(intx=0;
x<
x++)
t[x]=e[x+i*4];
for(inty=0;
y<
y++)
e[(y+4-i)%4+i*4]=t[y];
inShiftRows(unsignedchare[])//逆行移位变换函数
e[(y+i)%4+i*4]=t[y];
MatrixToByte(unsignedchare[])//列混合变换函数
intr,c;
for(c=0;
c<
4;
c++)
for(r=0;
r<
r++)
t[r]=e[r*4+c];
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]);
inMatrixToByte(unsignedchare[])//逆列混合变换函数
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;
bw[i]=bw[i-1]<
<
1;
if(bw[i-1]&
0x80)
bw[i]^=0x1b;
for(i=0;
if((a>
>
i)&
0x01)
res^=bw[i];
returnres;
KeyAdding(unsignedcharstate[16],unsignedchark[][4])//轮密钥加
state[r+c*4]^=k[r][c];
KeyExpansion(unsignedchar*key,unsignedcharw[][4][4])//密钥扩展
inti,j,r,c;
unsignedcharrc[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};
for(r=0;
for(c=0;
w[0][r][c]=key[r+c*4];
i<
=10;
for(j=0;
unsignedchart[4];
for(r=0;
{
t[r]=jw[i][r][j-1]:
w[i-1][r][3];
}
if(j==0)
unsignedchartemp=t[0];
for(r=0;
3;
{
t[r]=sBox[t[(r+1)%4]];
}
t[3]=sBox[temp];
t[0]^=rc[i-1];
w[i][r][j]=w[i-1][r][j]^t[r];
~plaintext()
#include<
//使用文件选取功能
unsignedcharw[11][4][4]={0};
intlen=0;
//图片每行需要加密的长度
voidCipher();
//加密图片
voidinCipher();
//解密图片
voidCipher(unsignedchara[])
(len/16);
for(intj=0;
b[j]=a[j+i*16];
plaintext:
KeyAdding(b,w[0]);
for(intn=1;
n<
n++)
plaintext:
SubBytes(b);
ShiftRows(b);
if(n!
=10)plaintext:
MatrixToByte(b);
KeyAdding(b,w[n]);
for(intm=0;
m<
m++)
a[m+i*16]=b[m];
voidinCipher(unsignedchara[]){
(len/16);
KeyAdding(b,w[10]);
for(intn=9;
n>
=0;
n--)
inShiftRows(b);
inSubBytes(b);
if(n)plaintext:
inMatrixToByte(b);
boolImageCopy(constCImage&
srcImage,CImage&
destImage)
inti,j;
//循环变量
if())
returnFALSE;
//源图像参数
BYTE*srcPtr=(BYTE*)();
intsrcBitsCount=();
intsrcWidth=();
intsrcHeight=();
intsrcPitch=();
//销毁原有图像
if(!
())
();
//创建新图像
if(srcBitsCount==32)//支持alpha通道
(srcWidth,srcHeight,srcBitsCount,1);
else
(srcWidth,srcHeight,srcBitsCount,0);
BYTE*destPtr=(BYTE*)();
intdestPitch=();
len=abs(srcPitch);
srcHeight;
Cipher(srcPtr+i*srcPitch);
//复制图像数据
memcpy(destPtr+i*destPitch,srcPtr+i*srcPitch,abs(srcPitch));
returnTRUE;
boolinImageCopy(constCImage&
len=abs(srcPitch);
inCipher(srcPtr+i*srcPitch);
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};
=sizeof(ofn);
//=m_hWnd;
=_T("
);
//要选择的文件后缀
D:
\\"
//默认的文件路径
=szBuffer;
//存放文件的缓冲区
=sizeof(szBuffer)/sizeof(*szBuffer);
=0;
=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER;
//标志如果是多选要加上OFN_ALLOWMULTISELECT
BOOLbSel=GetOpenFileName(&
ofn);
CImageimage,image2,image3;
//读取图片
(szBuffer);
ImageCopy(image,image2);
("
e:
/"
inImageCopy(image2,image3);
system("
pause"
本数据记录
和计算
运行程序,出现选择图片界面
加密结束
原图片加密图片解密图片
结论
(结果)
根据结果显示,程序成功的实现了对图片的加密,得到的加密后的结果仍然为图片,并成功地的解密得到了正确的解密后的图片。
小结
通过本次试验,成功的完成了对AES密码算法的初步编写,了解了AES算法的工作原理。
对于图片加密方面,掌握了新的调用图片的方法,使用头文件大大简化了c++中对图片调用的难度。
同时在文件读取方面使用了头文件,使得程序在使用上更加方便。
指导老师评议
成绩评定:
指导教师签名:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AES 加密算法 实验 报告