資源簡介
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
- 上一篇:家譜管理系統 VC
- 下一篇:基于 OPENCV 對三角形 的 角度檢測
評論
共有 條評論