AES加密算法实验报告Word文件下载.docx
《AES加密算法实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《AES加密算法实验报告Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
实验环境
PC机,Windows7操作系统,VisualC++6.0
实验内容(算法、程序、步骤和方法)
一、简介
美国国家标准技术研究所在2001年发布了高级加密标准(AES)。
AES是一个对称加密算法,旨在取代DES成为广泛使用的标准。
AES中的所有运算都是在8为的字节上运行的。
特别饿,加减乘除算术都是在有限域GF(28)上运行的。
二、程序特点
本次试验中要求对图片进行加密与解密,并将加密结果以图片格式进行保存。
因此为了实现对图片的调度及保存,使用头文件atlimage.h进行对图片的操作,实现对图片的像素读取,图片的保存。
在程序运行读取需要加密的图片时,需要进行图片的选取,本次实验中使用在弹窗中选取文件的方式,使用头文件commdlg.h来实现在文件夹中选择需要的文件的选取。
三、加密算法流程
AES加密算法流程如下
字节代替:
用一个S盒完成分组的字节到字节的代替;
行移位:
进行一次行上的置换;
列混合:
利用有限域GF(28)上的运算特性的一个代替;
轮密钥加:
当前分组和扩展密钥的一部分进行按位异或。
四、代码实现
cryptograph.h
#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:
};
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];
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]=j?
w[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()
main.cpp
#include<
atlimage.h>
commdlg.h>
//使用文件选取功能
unsignedcharw[11][4][4]={0};
intlen=0;
//图片每行需要加密的长度
voidCipher();
//加密图片
voidinCipher();
//解密图片
voidCipher(unsignedchara[])
(len/16);
for(intj=0;
b[j]=a[j+i*