📄 aes.cpp
字号:
unsigned char* output)
{
unsigned long* m_State = State;
unsigned long* m_Word = Word;
memcpy(m_State, input,Nb<<2);
unsigned char temp[4];
int r;
for (r = 0; r < Nb; ++r)
{
m_State[r] ^= m_Word[r];
}
for (int round =1; round <Nr; ++round)
{
m_Word += Nb;
/*
假设Nb=4;
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | s7 |
---------------------
| s8 | s9 | sa | sb |
---------------------
| sc | sd | se | sf |
---------------------
| | | | |
---------------------
| | | | |
---------------------
| | | | |
---------------------
*/
memcpy(m_State+Nb,m_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*)m_State)];
temp[1] = Sbox[*((unsigned char*)m_State+5)];
temp[2] = Sbox[*((unsigned char*)m_State+10)];
temp[3] = Sbox[*((unsigned char*)m_State+15)];
*((unsigned char*)m_State) = Log_02[temp[0]] ^ Log_03[temp[1]] ^ temp[2] ^ temp[3];
*((unsigned char*)m_State+1) = Log_02[temp[1]] ^ Log_03[temp[2]] ^ temp[3] ^ temp[0];
*((unsigned char*)m_State+2) = Log_02[temp[2]] ^ Log_03[temp[3]] ^ temp[0] ^ temp[1];
*((unsigned char*)m_State+3) = Log_02[temp[3]] ^ Log_03[temp[0]] ^ temp[1] ^ temp[2];
*m_State ^= m_Word[r];
m_State++;
}
m_State -= Nb;
}
memcpy(m_State+Nb,m_State,12);
m_Word += Nb;
for(r =0; r<Nb; r++)
{
*((unsigned char*)m_State) = Sbox[*(unsigned char*)m_State];
*((unsigned char*)m_State+1) = Sbox[*((unsigned char*)m_State+5)];
*((unsigned char*)m_State+2) = Sbox[*((unsigned char*)m_State+10)];
*((unsigned char*)m_State+3) = Sbox[*((unsigned char*)m_State+15)];
*m_State ^= m_Word[r];
m_State++;
}
memcpy(output,State,Nb<<2);
}
//#endif
/*
解密时进行Nr轮逆运算
AES * aes 运行时参数
*/
void AES::invCipher(
const unsigned char* input,
unsigned char* output)
{
unsigned long* m_State = State;
unsigned long* m_Word = Word;
memcpy(m_State, input,Nb<<2);
unsigned char temp[4];
int r =0;
m_Word += Nb*Nr;
for (r = 0; r < Nb; ++r)
{
m_State[r] ^= m_Word[r];
}
m_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(m_State,m_State+Nb,12);
/*
Nb=4;
---------------------
| | | | s7 |
---------------------
| | | sa | sb |
---------------------
| | sd | se | sf |
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | |
---------------------
| s8 | s9 | | |
---------------------
| sc | | | |
---------------------
*/
m_Word -= Nb;
m_State += Nb+2;
for(r = Nb-1; r >= 0; r--)
{
/*
temp = {iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};
*/
temp[0] = iSbox[*(unsigned char*)m_State];
temp[1] = iSbox[*((unsigned char*)m_State-3)];
temp[2] = iSbox[*((unsigned char*)m_State-6)];
temp[3] = iSbox[*((unsigned char*)m_State-9)];
*(unsigned long*)temp ^= m_Word[r];
*(unsigned char*)m_State = Log_0e[temp[0]] ^ Log_0b[temp[1]] ^ Log_0d[temp[2]] ^ Log_09[temp[3]];
*((unsigned char*)m_State+1) = Log_0e[temp[1]] ^ Log_0b[temp[2]] ^ Log_0d[temp[3]] ^ Log_09[temp[0]];
*((unsigned char*)m_State+2) = Log_0e[temp[2]] ^ Log_0b[temp[3]] ^ Log_0d[temp[0]] ^ Log_09[temp[1]];
*((unsigned char*)m_State+3) = Log_0e[temp[3]] ^ Log_0b[temp[0]] ^ Log_0d[temp[1]] ^ Log_09[temp[2]];
m_State --;
}
m_State -= 2;
}
m_Word -= Nb;
memcpy(m_State,m_State+Nb,12);
m_State += Nb+2;
for(r = Nb-1; r >= 0; r--)
{
*(unsigned char*)m_State = iSbox[*(unsigned char*)m_State];
*((unsigned char*)m_State+1) = iSbox[*((unsigned char*)m_State-3)];
*((unsigned char*)m_State+2) = iSbox[*((unsigned char*)m_State-6)];
*((unsigned char*)m_State+3) = iSbox[*((unsigned char*)m_State-9)];
*m_State ^= m_Word[r];
m_State --;
}
memcpy(output, State,Nb<<2);
}
/*
*--------------------------------------------
*|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)
{
// printf("9\n");
unsigned long *w =new unsigned long[Nb * (Nr+1)]; // 4 columns of bytes corresponds to a word
// printf("a\n");
memcpy(w,key,Nk<<2);
unsigned long temp;
// printf("b\n");
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -