• 大小: 145KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-23
  • 语言: C/C++
  • 标签: AES  优化  加密  解密  

资源简介

AES加密与解密算法的优化 可用于文件加密 c++实现 含pdf文件说明优化的过程

资源截图

代码片段和文件信息

// AES.cpp: implementation of the AES class.
//
//////////////////////////////////////////////////////////////////////

#include “AES.h“
#include 
using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

AES::AES()
{

}

AES::~AES()
{

}

void AES::keyExpansion(unsigned char *key)
{//密钥扩展
unsigned long RCon[]=  {0x010000000x020000000x04000000
0x080000000x100000000x200000000x40000000
0x800000000x1b0000000x36000000};
unsigned long w[44]={0}temp;
int ij;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
temp=(unsigned  char)key[4*i+j];
w[i]=w[i]|(temp<<(24-8*j));//用4个字符组成一个32位的数据
}
}
for(i=4;i<44;i++){
temp=w[i-1];
if(i%4==0){
temp=subWord(rotWord(temp))^RCon[i/4-1];
}
w[i]=w[i-4]^temp;
}
for(i=0;i<16;i++) W[0][i]=key[i];
for(i=0;i<40;i++){
for(j=0;j<4;j++){
W[i/4+1][i%4*4+j]=(w[i+4]>>(24-8*j))&0xff;
}
}
}

void AES::setKey(unsigned char *keyint len)
{
int i;
K=len/4;
R=K+6;//得到轮数
//NB=K*(R+1);//轮密钥总长度;
W=new unsigned char*[R+1];
for(i=0;i W[i]=new unsigned char[len];
keyExpansion(key);
}

unsigned long AES::rotWord(unsigned long temp)//32位数据 循环移位
{
unsigned long t=temp>>24&0xff;//
temp=(temp<<8)|t;
return temp;
}

unsigned long AES::subWord(unsigned long temp)
{
unsigned long t;
unsigned long ts[]={0x00ffffff0xff00ffff0xffff00ff0xffffff00};
int move;
for(int i=0;i<4;i++){
move=(3-i)*8;
t=temp>>move&0xff;
t=S_01[t]< temp=temp&ts[i]|t;
}
return temp;
}

void AES::show()
{//输出状态矩阵
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
printf(“%x “state[j][i]&0xff);
cout<}


void AES::encode(unsigned char *plaintext unsigned char *ciphertest)
{
int ijk;
unsigned char t[4][4];
unsigned char tmp[3];
for(i=0;i<4;i++)//
for(j=0;j<4;j++)
state[i][j]=plaintext[4*j+i]^W[0][j*4+i];//第一次轮密钥异或
for(k=1;k for(i=0;i<4;i++)
for(j=0;j<4;j++) 
t[i][j]=state[i][j];
for(i=0;i<4;i++){//S_XX表为域元素先作S盒变换再与XX作域元素的乘法 下面的算法还将循环移位加在了里面
state[0][i]=S_02[t[0][ i     ]]^S_03[t[1][(i+1)%4]]^S_01[t[2][(i+2)%4]]^S_01[t[3][(i+3)%4]];
state[1][i]=S_02[t[1][(i+1)%4]]^S_03[t[2][(i+2)%4]]^S_01[t[3][(i+3)%4]]^S_01[t[0][ i     ]];
state[2][i]=S_02[t[2][(i+2)%4]]^S_03[t[3][(i+3)%4]]^S_01[t[0][ i     ]]^S_01[t[1][(i+1)%4]];
state[3][i]=S_02[t[3][(i+3)%4]]^S_03[t[0][ i     ]]^S_01[t[1][(i+1)%4]]^S_01[t[2][(i+2)%4]];
}
for(i=0;i<4;i++)//第k次加轮密钥
for(j=0;j<4;j++)
state[i][j]=state[i][j]^W[k][j*4+i];
}
//要盒代换与循环移位可以互换
for(i=0;i<4;i++)
for(j=0;j<4;j++)//最后一次S盒代换
state[i][j]=S_01[state[i][j]];
for(i=1;i<4;i++){//循环移位
memcpy(tmpstate[i]i);
memcpy(state[i]state[i]+i4-i);
memcpy(state[i]+4-itmpi);
}
for(i=0;i<4;i++)//最后一次加轮密钥
for(j=0;j<4;j++)
ciphertest[j*4+i]=state[i][j]^

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     120412  2010-04-20 19:27  优化2AES\lunwen.pdf

     文件      49664  2010-05-01 18:56  优化2AES\AES.opt

     文件       1443  2010-05-01 18:56  优化2AES\AES.plg

     文件     123904  2010-05-01 18:56  优化2AES\AES.ncb

     文件       4567  2010-05-01 18:39  优化2AES\AES.cpp

     文件       4465  2010-05-01 18:42  优化2AES\util.h

     文件        514  2001-01-01 01:37  优化2AES\AES.dsw

     文件      14559  2010-05-01 18:48  优化2AES\AES.h

     文件        654  2010-05-01 18:56  优化2AES\text.cpp

     文件       1098  2010-05-01 18:56  优化2AES\FileEncodeAndDecode.h

     文件       4409  2010-05-01 18:56  优化2AES\FileEncodeAndDecode.cpp

     文件        359  2010-04-21 18:36  优化2AES\ES.cpp

     文件        668  2010-04-21 18:36  优化2AES\ES.h

     文件       4686  2010-04-21 18:37  优化2AES\AES.dsp

     目录          0  2010-04-22 09:53  优化2AES\Debug

     目录          0  2010-04-22 09:53  优化2AES

----------- ---------  ---------- -----  ----

               331402                    16


评论

共有 条评论