?? aes.cpp
字號:
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 <Nr; ++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<Nb; 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) = (unsigned char)(Log_02[temp[0]] ^ Log_03[temp[1]] ^ temp[2] ^ temp[3]);
*((unsigned char*)State+1) = (unsigned char)(Log_02[temp[1]] ^ Log_03[temp[2]] ^ temp[3] ^ temp[0]);
*((unsigned char*)State+2) = (unsigned char)(Log_02[temp[2]] ^ Log_03[temp[3]] ^ temp[0] ^ temp[1]);
*((unsigned char*)State+3) = (unsigned char)(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<Nb; 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[*(unsigned char*)State];
temp[1] = iSbox[*((unsigned char*)(State-1)+1)];
temp[2] = iSbox[*((unsigned char*)(State-2)+2)];
temp[3] = iSbox[*((unsigned char*)(State-3)+3)];
*(unsigned long*)temp ^= Word[r];
*(unsigned char*)State = (unsigned char)(Log_0e[temp[0]] ^ Log_0b[temp[1]] ^ Log_0d[temp[2]] ^ Log_09[temp[3]]);
*((unsigned char*)State+1) = (unsigned char)(Log_0e[temp[1]] ^ Log_0b[temp[2]] ^ Log_0d[temp[3]] ^ Log_09[temp[0]]);
*((unsigned char*)State+2) = (unsigned char)(Log_0e[temp[2]] ^ Log_0b[temp[3]] ^ Log_0d[temp[0]] ^ Log_09[temp[1]]);
*((unsigned char*)State+3) = (unsigned char)(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(unsigned char* 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((unsigned char*)&temp);
temp ^= Rcon[c/Nk];
}
else if ( Nk > 6 && (c % Nk == 4) )
{
SubWord((unsigned char*)&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;i<aes->Nb;i++)
// {
// printf("%d\n",i);
// free(aes->State[i]);
// free(aes->Word[i]);
// }
// printf("sdffd");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -