當前位置:編程學習大全網 - 源碼下載 - 高分急求AES源代碼

高分急求AES源代碼

#define decrypt TRUE

#define encrypt FALSE

#define TYPE BOOL

typedef struct _AES{

int Nb;

int Nr;

int Nk;

unsigned long *Word;

unsigned long *State;

}AES;

/*

加密數據

byte *input 明文

byte *inSize 明文長

byte *out 密文存放的地方

byte *key 密鑰key

byte *keySize 密鑰長

*/

void Cipher(

unsigned char* input,

int inSize,

unsigned char* out,

unsigned char* key,

int keySize);

/*

解密數據

byte *input 密文

int *inSize 密文長

byte *out 明文存放的地方

byte *key 密鑰key

int *keySize 密鑰長

*/

void InvCipher(

unsigned char* input,

int inSize,

unsigned char* out,

unsigned char* key,

int keySize);

/*

生成加密用的參數AES結構

int inSize 塊大小

byte* 密鑰

int 密鑰長

unsigned long 屬性(標實類型)

返回AES結構指針

*/

AES *InitAES(AES *aes,

int inSize,

unsigned char* key,

int keySize, TYPE type);

/*

生成加密用的參數AES結構

int inSize 塊大小

byte* 密鑰

int 密鑰長

返回AES結構指針

*/

AES *InitAES(

int inSize,

unsigned char* key,

int keySize, BOOL );

/*

加密時進行Nr輪運算

AES * aes 運行時參數

*/

void CipherLoop(

AES *aes);

/*

解密時進行Nr輪逆運算

AES * aes 運行時參數

*/

void InvCipherLoop(

AES *aes);

/*

釋放AES結構和State和密鑰庫word

*/

void freeAES(

AES *aes);

//AES.cpp

#include "stdafx.h"

#include

#include

#include "AES.h"

unsigned char* SubWord(unsigned char* word);

unsigned long* keyExpansion(unsigned char* key, int Nk, int Nr,int);

/*

加密數據

byte *input 明文

byte *inSize 明文長

byte *out 密文存放的地方

byte *key 密鑰key

byte *keySize 密鑰長

*/

void Cipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)

{

AES aes ;

InitAES(&aes,inSize,key,keySize,encrypt);

memcpy(aes.State,input,inSize);

CipherLoop(&aes);

memcpy(out,aes.State,inSize);

}

/*

解密數據

byte *input 密文

int *inSize 密文長

byte *out 明文存放的地方

byte *key 密鑰key

int *keySize 密鑰長

*/

void InvCipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)

{

AES aes;

InitAES(&aes,inSize,key,keySize,decrypt);

memcpy(aes.State,input,inSize);

InvCipherLoop(&aes);

memcpy(aes.State,out,inSize);

}

/*

生成加密用的參數AES結構

int inSize 塊大小

byte* 密鑰

int 密鑰長

返回AES結構指針

*/

AES *InitAES(AES *aes,int inSize, unsigned char *key, int keySize, TYPE type)

{

int Nb = inSize >>2,

Nk = keySize >>2,

Nr = Nb < Nk ? Nk:Nb+6;

aes->Nb = Nb;

aes->Nk = Nk;

aes->Nr = Nr;

aes->Word = keyExpansion(key,Nb,Nr,Nk);

aes->State = new unsigned long[Nb+3];

if(type)

aes->State += 3;

return aes;

}

/*

生成加密用的參數AES結構

int inSize 塊大小

byte* 密鑰

int 密鑰長

返回AES結構指針

*/

AES *InitAES(int inSize, unsigned char* key, int keySize,unsigned long type)

{

return InitAES(new AES(),inSize,key,keySize,type);

}

/*

*/

void CipherLoop(AES *aes)

{

unsigned char temp[4];

unsigned long *word8 = aes->Word,

*State = aes->State;

int Nb = aes->Nb,

Nr = aes->Nr;

int r;

for (r = 0; r < Nb; ++r)

{

State[r] ^= word8[r];

}

for (int round =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[*((unsigned char*)State)];

temp[1] = Sbox[*((unsigned char*)(State+1)+1)];

temp[2] = Sbox[*((unsigned char*)(State+2)+2)];

temp[3] = Sbox[*((unsigned char*)(State+3)+3)];

*((unsigned char*)State) = Log_02[temp[0]] ^ Log_03[temp[1]] ^ temp[2] ^ temp[3];

*((unsigned char*)State+1) = Log_02[temp[1]] ^ Log_03[temp[2]] ^ temp[3] ^ temp[0];

*((unsigned char*)State+2) = Log_02[temp[2]] ^ Log_03[temp[3]] ^ temp[0] ^ temp[1];

*((unsigned char*)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 {

*((unsigned char*)State) = Sbox[*(unsigned char*)State];

*((unsigned char*)State+1) = Sbox[*((unsigned char*)(State+1)+1)];

*((unsigned char*)State+2) = Sbox[*((unsigned char*)(State+2)+2)];

*((unsigned char*)State+3) = Sbox[*((unsigned char*)(State+3)+3)];

*State ^= word8[r];

State++;

}

}

/*

解密時進行Nr輪逆運算

AES * aes 運行時參數

*/

void InvCipherLoop(AES *aes)

{

unsigned long *Word = aes->Word,

*State = aes->State;

int Nb = aes->Nb,

Nr = aes->Nr;

unsigned char temp[4];

int r =0;

Word += Nb*Nr;

for (r = 0; r < Nb; ++r)

{

State[r] ^= Word[r];

}

State -= 3;

for (int round = 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)];

*(unsigned long*)temp ^= Word[r];

*(unsigned char*)State = Log_0e[temp[0]] ^ Log_0b[temp[1]] ^ Log_0d[temp[2]] ^ Log_09[temp[3]];

*((unsigned char*)State+1) = Log_0e[temp[1]] ^ Log_0b[temp[2]] ^ Log_0d[temp[3]] ^ Log_09[temp[0]];

*((unsigned char*)State+2) = Log_0e[temp[2]] ^ Log_0b[temp[3]] ^ Log_0d[temp[0]] ^ Log_09[temp[1]];

*((unsigned char*)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--)

{

*(unsigned char*)State = iSbox[*(unsigned char*)State];

*((unsigned char*)State+1) = iSbox[*((unsigned char*)(State-1)+1)];

*((unsigned char*)State+2) = iSbox[*((unsigned char*)(State-2)+2)];

*((unsigned char*)State+3) = iSbox[*((unsigned char*)(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 |

*---------------------

*/

unsigned long* keyExpansion(byte* key, int Nb, int Nr, int Nk)

{

unsigned long *w =new unsigned long[Nb * (Nr+1)]; // 4 columns of bytes corresponds to a word

memcpy(w,key,Nk<<2);

unsigned long temp;

for (int c = Nk; c < Nb * (Nr+1); ++c)

{

//把上壹輪的最後壹行放入temp

temp = w[c-1];

//判斷是不是每壹輪密鑰的第壹行

if (c % Nk == 0)

{

//左旋8位

temp = (temp<<8)|(temp>>24);

//查Sbox表

SubWord((byte*)&temp);

temp ^= Rcon[c/Nk];

}

else if ( Nk > 6 && (c % Nk == 4) )

{

SubWord((byte*)&temp);

}

//w[c-Nk] 為上壹輪密鑰的第壹行

w[c] = w[c-Nk] ^ temp;

}

return w;

}

unsigned char* SubWord(unsigned char* word)

{

word[0] = Sbox[ word[0] ];

word[1] = Sbox[ word[1] ];

word[2] = Sbox[ word[2] ];

word[3] = Sbox[ word[3] ];

return word;

}

/*

釋放AES結構和State和密鑰庫word

*/

void freeAES(AES *aes)

{

// for(int i=0;iNb;i++)

// {

// printf("%d\n",i);

// free(aes->State[i]);

// free(aes->Word[i]);

// }

// printf("sdffd");

}

  • 上一篇:拉取騰訊視頻流過程
  • 下一篇:小劇場源代碼
  • copyright 2024編程學習大全網