AES加密算法源代码.docx
《AES加密算法源代码.docx》由会员分享,可在线阅读,更多相关《AES加密算法源代码.docx(9页珍藏版)》请在冰豆网上搜索。
![AES加密算法源代码.docx](https://file1.bdocx.com/fileroot1/2022-11/23/5117b44b-e822-435e-9299-855c3e3c9027/5117b44b-e822-435e-9299-855c3e3c90271.gif)
AES加密算法源代码
//AES.h
#definedecryptTRUE
#defineencryptFALSE
#defineTYPEBOOL
typedefstruct_AES{
intNb;
intNr;
intNk;
unsignedlong*Word;
unsignedlong*State;
}AES;
/*
加密数据,这个函数和下面的InvCipher用于演示用的,只作了一次加密或解密。
要进行大数据量加解密只需对这两个函数稍作修改就可以了。
byte*input明文
byte*inSize明文长
byte*out密文存放的地方
byte*key密钥key
byte*keySize密钥长
*/
voidCipher(
unsignedchar*input,
intinSize,
unsignedchar*out,
unsignedchar*key,
intkeySize);
/*
解密数据
byte*input密文
int*inSize密文长
byte*out明文存放的地方
byte*key密钥key
int*keySize密钥长
*/
voidInvCipher(
unsignedchar*input,
intinSize,
unsignedchar*out,
unsignedchar*key,
intkeySize);
/*
生成加密用的参数AES结构
intinSize块大小
byte*密钥
int密钥长
unsignedlong属性(标实类型)
返回AES结构指针
*/
AES*InitAES(AES*aes,
intinSize,
unsignedchar*key,
intkeySize,TYPEtype);
/*
生成加密用的参数AES结构
intinSize块大小
byte*密钥
int密钥长
返回AES结构指针
*/
AES*InitAES(
intinSize,
unsignedchar*key,
intkeySize,BOOL);
/*
加密时进行Nr轮运算
AES*aes运行时参数
*/
voidCipherLoop(
AES*aes);
/*
解密时进行Nr轮逆运算
AES*aes运行时参数
*/
voidInvCipherLoop(
AES*aes);
/*
释放AES结构和State和密钥库word
*/
voidfreeAES(
AES*aes);
//AES.cpp
#include"stdafx.h"
#include
#include
#include"AES.h"
unsignedchar*SubWord(unsignedchar*word);
unsignedlong*keyExpansion(unsignedchar*key,intNk,intNr,int);
/*
加密数据
byte*input明文
byte*inSize明文长
byte*out密文存放的地方
byte*key密钥key
byte*keySize密钥长
*/
voidCipher(unsignedchar*input,intinSize,unsignedchar*out,unsignedchar*key,intkeySize)
{
AESaes;
InitAES(&aes,inSize,key,keySize,encrypt);
//while(...){
memcpy(aes.State,input,inSize);
CipherLoop(&aes);
memcpy(out,aes.State,inSize);
//}
}
/*
解密数据
byte*input密文
int*inSize密文长
byte*out明文存放的地方
byte*key密钥key
int*keySize密钥长
*/
voidInvCipher(unsignedchar*input,intinSize,unsignedchar*out,unsignedchar*key,intkeySize)
{
AESaes;
InitAES(&aes,inSize,key,keySize,decrypt);
memcpy(aes.State,input,inSize);
InvCipherLoop(&aes);
memcpy(aes.State,out,inSize);
}
/*
生成加密用的参数AES结构
intinSize块大小
byte*密钥
int密钥长
返回AES结构指针
*/
AES*InitAES(AES*aes,intinSize,unsignedchar*key,intkeySize,TYPEtype)
{
intNb=inSize>>2,
Nk=keySize>>2,
Nr=NbNk:
Nb+6;
aes->Nb=Nb;
aes->Nk=Nk;
aes->Nr=Nr;
aes->Word=keyExpansion(key,Nb,Nr,Nk);
aes->State=newunsignedlong[Nb+3];
if(type)
aes->State+=3;
returnaes;
}
/*
生成加密用的参数AES结构
intinSize块大小
byte*密钥
int密钥长
返回AES结构指针
*/
AES*InitAES(intinSize,unsignedchar*key,intkeySize,unsignedlongtype)
{
returnInitAES(newAES(),inSize,key,keySize,type);
}
/*
*/
voidCipherLoop(AES*aes)
{
unsignedchartemp[4];
unsignedlong*word8=aes->Word,
*State=aes->State;
intNb=aes->Nb,
Nr=aes->Nr;
intr;
for(r=0;r{
State[r]^=word8[r];
}
for(intround=1;round{
word8+=Nb;
/*
假设Nb=4;
---------------------
|s0|s1|s2|s3|
---------------------
|s4|s5|s6|s7|
---------------------
|s8|s9|sa|sb|
---------------------
|sc|sd|se|sf|
---------------------
|||||
---------------------
|||||
---------------------
|||||
---------------------
*/
memcpy(State+Nb,State,12);
/*
Nb=4;
---------------------
|s0||||
---------------------
|s4|s5|||
---------------------
|s8|s9|sa||
---------------------
|sc|sd|se|sf|
---------------------
||s1|s2|s3|
---------------------
|||s6|s7|
---------------------
||||sb|
---------------------
*/
for(r=0;r{
/*
temp={Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};
*/
temp[0]=Sbox[*((unsignedchar*)State)];
temp[1]=Sbox[*((unsignedchar*)(State+1)+1)];
temp[2]=Sbox[*((unsignedchar*)(State+2)+2)];
temp[3]=Sbox[*((unsignedchar*)(State+3)+3)];
*((unsignedchar*)State)=Log_02[temp[0]]^Log_03[temp[1]]^temp[2]^temp[3];
*((unsignedchar*)State+1)=Log_02[temp[1]]^Log_03[temp[2]]^temp[3]^temp[0];
*((unsignedchar*)State+2)=Log_02[temp[2]]^Log_03[temp[3]]^temp[0]^temp[1];
*((unsignedchar*)State+3)=Log_02[temp[3]]^Log_03[temp[0]]^temp[1]^temp[2];
*State^=word8[r];
State++;
}
State-=Nb;
}
memcpy(State+Nb,State,12);
word8+=Nb;
for(r=0;r{
*((unsignedchar*)State)=Sbox[*(unsignedchar*)State];
*((unsignedchar*)State+1)=Sbox[*((unsignedchar*)(State+1)+1)];
*((unsignedchar*)State+2)=Sbox[*((unsignedchar*)(State+2)+2)];
*((unsignedchar*)State+3)=Sbox[*((unsignedchar*)(State+3)+3)];
*State^=word8[r];
State++;
}
}
/*
解密时进行Nr轮逆运算
AES*aes运行时参数
*/
voidInvCipherLoop(AES*aes)
{
unsignedlong*Word=aes->Word,
*State=aes->State;
intNb=aes->Nb,
Nr=aes->Nr;
unsignedchartemp[4];
intr=0;
Word+=Nb*Nr;
for(r=0;r{
State[r]^=Word[r];
}
State-=3;
for(intround=Nr-1;round>0;--round)
{
/*
假设Nb=4;
---------------------
|||||
---------------------
|||||
---------------------
|||||
---------------------
|s0|s1|s2|s3|
---------------------
|s4|s5|s6|s7|
---------------------
|s8|s9|sa|sb|
---------------------
|sc|sd|se|sf|
---------------------
*/
memcpy(State,State+Nb,12);
/*
Nb=4;
---------------------
||||s7|
---------------------
|||sa|sb|
---------------------
||sd|se|sf|
---------------------
|s0|s1|s2|s3|
---------------------
|s4|s5|s6||
---------------------
|s8|s9|||
---------------------
|sc||||
---------------------
*/
Word-=Nb;
State+=Nb+2;
for(r=Nb-1;r>=0;r--)
{
/*
temp={iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};
*/
temp[0]=iSbox[*(byte*)State];
temp[1]=iSbox[*((byte*)(State-1)+1)];
temp[2]=iSbox[*((byte*)(State-2)+2)];
temp[3]=iSbox[*((byte*)(State-3)+3)];
*(unsignedlong*)temp^=Word[r];
*(unsignedchar*)State=Log_0e[temp[0]]^Log_0b[temp[1]]^Log_0d[temp[2]]^Log_09[temp[3]];
*((unsignedchar*)State+1)=Log_0e[temp[1]]^Log_0b[temp[2]]^Log_0d[temp[3]]^Log_09[temp[0]];
*((unsignedchar*)State+2)=Log_0e[temp[2]]^Log_0b[temp[3]]^Log_0d[temp[0]]^Log_09[temp[1]];
*((unsignedchar*)State+3)=Log_0e[temp[3]]^Log_0b[temp[0]]^Log_0d[temp[1]]^Log_09[temp[2]];
State--;
}
State-=2;
}
Word-=Nb;
memcpy(State,State+Nb,12);
State+=Nb+2;
for(r=Nb-1;r>=0;r--)
{
*(unsignedchar*)State=iSbox[*(unsignedchar*)State];
*((unsignedchar*)State+1)=iSbox[*((unsignedchar*)(State-1)+1)];
*((unsignedchar*)State+2)=iSbox[*((unsignedchar*)(State-2)+2)];
*((unsignedchar*)State+3)=iSbox[*((unsignedchar*)(State-3)+3)];
*State^=Word[r];
State--;
}
}
/*
*--------------------------------------------
*|k0|k1|k2|k3|k4|k5|k6|k7|k8|k9|.......|Nk*4|
*--------------------------------------------
*Nr轮密钥库
*每个密钥列长度为Nb
*---------------------
*|k0|k1|k2|k3|
*---------------------
*|k4|k5|k6|k7|
*---------------------
*|k8|k9|ka|kb|
*---------------------
*|kc|kd|ke|kf|
*---------------------
*/
unsignedlong*keyExpansion(byte*key,intNb,intNr,intNk)
{
unsignedlong*w=newunsignedlong[Nb*(Nr+1)];//4columnsofbytescorrespondstoaword
memcpy(w,key,Nk<<2);
unsignedlongtemp;
for(intc=Nk;c{
//把上一轮的最后一行放入temp
temp=w[c-1];
//判断是不是每一轮密钥的第一行
if(c%Nk==0)
{
//左旋8位
temp=(temp<<8)|(temp>>24);
//查Sbox表
SubWord((byte*)&temp);
temp^=Rcon[c/Nk];
}
elseif(Nk>6&&(c%Nk==4))
{
SubWord((byte*)&temp);
}
//w[c-Nk]为上一轮密钥的第一行
w[c]=w[c-Nk]^temp;
}
returnw;
}
unsignedchar*SubWord(unsignedchar*word)
{
word[0]=Sbox[word[0]];
word[1]=Sbox[word[1]];
word[2]=Sbox[word[2]];
word[3]=Sbox[word[3]];
returnword;
}
/*
释放AES结构和State和密钥库word
*/
voidfreeAES(AES*aes)
{
//for(inti=0;iNb;i++)
//{
//printf("%d/n",i);
//free(aes->State[i]);
//free(aes->Word[i]);
//}
//printf("sdffd");
}