AES加密算法源代码.docx

上传人:b****5 文档编号:3573065 上传时间:2022-11-24 格式:DOCX 页数:9 大小:16.35KB
下载 相关 举报
AES加密算法源代码.docx_第1页
第1页 / 共9页
AES加密算法源代码.docx_第2页
第2页 / 共9页
AES加密算法源代码.docx_第3页
第3页 / 共9页
AES加密算法源代码.docx_第4页
第4页 / 共9页
AES加密算法源代码.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

AES加密算法源代码.docx

《AES加密算法源代码.docx》由会员分享,可在线阅读,更多相关《AES加密算法源代码.docx(9页珍藏版)》请在冰豆网上搜索。

AES加密算法源代码.docx

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=Nb

Nk:

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");

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1