📄 aes.c
字号:
/*************** Function *************************************************
*
*/
RET_VAL AES_DecKeySchedule(
BYTE *UserKey, // 荤侩磊 厚剐虐 涝仿
DWORD UserKeyLen, // 荤侩磊 厚剐虐狼 官捞飘 荐
AES_ALG_INFO *AlgInfo) // 鞠龋侩/汗龋侩 Round Key 积己/历厘
{
RIJNDAEL_CIPHER_KEY *RK_Struct=(RIJNDAEL_CIPHER_KEY *) AlgInfo->RoundKey;
DWORD *d_key=RK_Struct->RK; // 64 DWORDs
DWORD k_len, t_key[64];
u4byte i, t, u, v, w;
// UserKey狼 辨捞啊 何利例茄 版快 error 贸府
if( (UserKeyLen!=16) && (UserKeyLen!=24) && (UserKeyLen!=32) )
return CTR_INVALID_USERKEYLEN;
////
k_len = (UserKeyLen + 3) / 4;
RK_Struct->k_len = k_len;
RIJNDAEL_KeySchedule(UserKey, k_len, t_key);
d_key[0] = t_key[4 * k_len + 24];
d_key[1] = t_key[4 * k_len + 25];
d_key[2] = t_key[4 * k_len + 26];
d_key[3] = t_key[4 * k_len + 27];
for( i=4; i<4*(k_len+6); i+=4) {
imix_col(d_key[i+0], t_key[4*k_len+24-i+0]);
imix_col(d_key[i+1], t_key[4*k_len+24-i+1]);
imix_col(d_key[i+2], t_key[4*k_len+24-i+2]);
imix_col(d_key[i+3], t_key[4*k_len+24-i+3]);
}
d_key[i+0] = t_key[4*k_len+24-i+0];
d_key[i+1] = t_key[4*k_len+24-i+1];
d_key[i+2] = t_key[4*k_len+24-i+2];
d_key[i+3] = t_key[4*k_len+24-i+3];
return CTR_SUCCESS;
}
/*
DWORD A, B, C, D, T0, T1, *K=AlgInfo->RoundKey;
////
if( UserKeyLen!=SEED_USER_KEY_LEN )
return CTR_INVALID_USERKEYLEN;
////
BIG_B2D( &(UserKey[0]), A);
BIG_B2D( &(UserKey[4]), B);
BIG_B2D( &(UserKey[8]), C);
BIG_B2D( &(UserKey[12]), D);
T0 = A + C - KC0;
T1 = B - D + KC0;
K[0] = SEED_SL[0][(T0 )&0xFF] ^ SEED_SL[1][(T0>> 8)&0xFF]
^ SEED_SL[2][(T0>>16)&0xFF] ^ SEED_SL[3][(T0>>24)&0xFF];
K[1] = SEED_SL[0][(T1 )&0xFF] ^ SEED_SL[1][(T1>> 8)&0xFF]
^ SEED_SL[2][(T1>>16)&0xFF] ^ SEED_SL[3][(T1>>24)&0xFF];;
EncRoundKeyUpdate0(K+ 2, A, B, C, D, KC1 );
EncRoundKeyUpdate1(K+ 4, A, B, C, D, KC2 );
EncRoundKeyUpdate0(K+ 6, A, B, C, D, KC3 );
EncRoundKeyUpdate1(K+ 8, A, B, C, D, KC4 );
EncRoundKeyUpdate0(K+10, A, B, C, D, KC5 );
EncRoundKeyUpdate1(K+12, A, B, C, D, KC6 );
EncRoundKeyUpdate0(K+14, A, B, C, D, KC7 );
EncRoundKeyUpdate1(K+16, A, B, C, D, KC8 );
EncRoundKeyUpdate0(K+18, A, B, C, D, KC9 );
EncRoundKeyUpdate1(K+20, A, B, C, D, KC10);
EncRoundKeyUpdate0(K+22, A, B, C, D, KC11);
EncRoundKeyUpdate1(K+24, A, B, C, D, KC12);
EncRoundKeyUpdate0(K+26, A, B, C, D, KC13);
EncRoundKeyUpdate1(K+28, A, B, C, D, KC14);
EncRoundKeyUpdate0(K+30, A, B, C, D, KC15);
// Remove sensitive data
A = B = C = D = T0 = T1 = 0;
K = NULL;
//
return CTR_SUCCESS;
*/
/*************** Macros ***************************************************/
#define f_nround(bo, bi, k) { \
bo[0] = ft_tab[0][byte(bi[0],0)] \
^ ft_tab[1][byte(bi[1],1)] \
^ ft_tab[2][byte(bi[2],2)] \
^ ft_tab[3][byte(bi[3],3)] ^ k[0];\
bo[1] = ft_tab[0][byte(bi[1],0)] \
^ ft_tab[1][byte(bi[2],1)] \
^ ft_tab[2][byte(bi[3],2)] \
^ ft_tab[3][byte(bi[0],3)] ^ k[1];\
bo[2] = ft_tab[0][byte(bi[2],0)] \
^ ft_tab[1][byte(bi[3],1)] \
^ ft_tab[2][byte(bi[0],2)] \
^ ft_tab[3][byte(bi[1],3)] ^ k[2];\
bo[3] = ft_tab[0][byte(bi[3],0)] \
^ ft_tab[1][byte(bi[0],1)] \
^ ft_tab[2][byte(bi[1],2)] \
^ ft_tab[3][byte(bi[2],3)] ^ k[3];\
k += 4; \
}
#define i_nround(bo, bi, k) { \
bo[0] = it_tab[0][byte(bi[0],0)] \
^ it_tab[1][byte(bi[3],1)] \
^ it_tab[2][byte(bi[2],2)] \
^ it_tab[3][byte(bi[1],3)] ^ k[0];\
bo[1] = it_tab[0][byte(bi[1],0)] \
^ it_tab[1][byte(bi[0],1)] \
^ it_tab[2][byte(bi[3],2)] \
^ it_tab[3][byte(bi[2],3)] ^ k[1];\
bo[2] = it_tab[0][byte(bi[2],0)] \
^ it_tab[1][byte(bi[1],1)] \
^ it_tab[2][byte(bi[0],2)] \
^ it_tab[3][byte(bi[3],3)] ^ k[2];\
bo[3] = it_tab[0][byte(bi[3],0)] \
^ it_tab[1][byte(bi[2],1)] \
^ it_tab[2][byte(bi[1],2)] \
^ it_tab[3][byte(bi[0],3)] ^ k[3];\
k += 4; \
}
#ifdef LARGE_TABLES
#define f_lround(bo, bi, k) { \
bo[0] = fl_tab[0][byte(bi[0],0)] \
^ fl_tab[1][byte(bi[1],1)] \
^ fl_tab[2][byte(bi[2],2)] \
^ fl_tab[3][byte(bi[3],3)] ^ k[0];\
bo[1] = fl_tab[0][byte(bi[1],0)] \
^ fl_tab[1][byte(bi[2],1)] \
^ fl_tab[2][byte(bi[3],2)] \
^ fl_tab[3][byte(bi[0],3)] ^ k[1];\
bo[2] = fl_tab[0][byte(bi[2],0)] \
^ fl_tab[1][byte(bi[3],1)] \
^ fl_tab[2][byte(bi[0],2)] \
^ fl_tab[3][byte(bi[1],3)] ^ k[2];\
bo[3] = fl_tab[0][byte(bi[3],0)] \
^ fl_tab[1][byte(bi[0],1)] \
^ fl_tab[2][byte(bi[1],2)] \
^ fl_tab[3][byte(bi[2],3)] ^ k[3];\
}
#define i_lround(bo, bi, k) { \
bo[0] = il_tab[0][byte(bi[0],0)] \
^ il_tab[1][byte(bi[3],1)] \
^ il_tab[2][byte(bi[2],2)] \
^ il_tab[3][byte(bi[1],3)] ^ k[0];\
bo[1] = il_tab[0][byte(bi[1],0)] \
^ il_tab[1][byte(bi[0],1)] \
^ il_tab[2][byte(bi[3],2)] \
^ il_tab[3][byte(bi[2],3)] ^ k[1];\
bo[2] = il_tab[0][byte(bi[2],0)] \
^ il_tab[1][byte(bi[1],1)] \
^ il_tab[2][byte(bi[0],2)] \
^ il_tab[3][byte(bi[3],3)] ^ k[2];\
bo[3] = il_tab[0][byte(bi[3],0)] \
^ il_tab[1][byte(bi[2],1)] \
^ il_tab[2][byte(bi[1],2)] \
^ il_tab[3][byte(bi[0],3)] ^ k[3];\
}
#else
#define f_rl(bo, bi, n, k) \
bo[n] = (u4byte)sbx_tab[byte(bi[n],0)] ^ \
rotl(((u4byte)sbx_tab[byte(bi[(n + 1) & 3],1)]), 8) ^ \
rotl(((u4byte)sbx_tab[byte(bi[(n + 2) & 3],2)]), 16) ^ \
rotl(((u4byte)sbx_tab[byte(bi[(n + 3) & 3],3)]), 24) ^ *(k + n)
#define i_rl(bo, bi, n, k) \
bo[n] = (u4byte)isb_tab[byte(bi[n],0)] ^ \
rotl(((u4byte)isb_tab[byte(bi[(n + 3) & 3],1)]), 8) ^ \
rotl(((u4byte)isb_tab[byte(bi[(n + 2) & 3],2)]), 16) ^ \
rotl(((u4byte)isb_tab[byte(bi[(n + 1) & 3],3)]), 24) ^ *(k + n)
#define f_lround(bo, bi, k) \
f_rl(bo, bi, 0, k); \
f_rl(bo, bi, 1, k); \
f_rl(bo, bi, 2, k); \
f_rl(bo, bi, 3, k)
#define i_lround(bo, bi, k) \
i_rl(bo, bi, 0, k); \
i_rl(bo, bi, 1, k); \
i_rl(bo, bi, 2, k); \
i_rl(bo, bi, 3, k)
#endif
/*************** Function *************************************************
*
*/
void AES_Encrypt(
void *CipherKey, // 鞠/汗龋侩 Round Key
BYTE *Data) // 涝免仿阑 困茄 喉废阑 啊府虐绰 pointer
{
RIJNDAEL_CIPHER_KEY *RK_Struct=CipherKey;
DWORD *e_key=RK_Struct->RK; // 64 DWORDs
DWORD k_len=RK_Struct->k_len;
u4byte b0[4], b1[4], *kp;
LITTLE_B2D(&(Data[ 0]), b0[0]);
LITTLE_B2D(&(Data[ 4]), b0[1]);
LITTLE_B2D(&(Data[ 8]), b0[2]);
LITTLE_B2D(&(Data[12]), b0[3]);
//
b0[0] ^= e_key[0];
b0[1] ^= e_key[1];
b0[2] ^= e_key[2];
b0[3] ^= e_key[3];
kp = e_key + 4;
switch( k_len ) {
case 8 :
f_nround(b1, b0, kp); f_nround(b0, b1, kp);
case 6 :
f_nround(b1, b0, kp); f_nround(b0, b1, kp);
case 4 :
f_nround(b1, b0, kp); f_nround(b0, b1, kp);
f_nround(b1, b0, kp); f_nround(b0, b1, kp);
f_nround(b1, b0, kp); f_nround(b0, b1, kp);
f_nround(b1, b0, kp); f_nround(b0, b1, kp);
f_nround(b1, b0, kp); f_lround(b0, b1, kp);
}
//
LITTLE_D2B(b0[0], &(Data[ 0]));
LITTLE_D2B(b0[1], &(Data[ 4]));
LITTLE_D2B(b0[2], &(Data[ 8]));
LITTLE_D2B(b0[3], &(Data[12]));
}
/*************** Function *************************************************
*
*/
void AES_Decrypt(
void *CipherKey, // 鞠/汗龋侩 Round Key
BYTE *Data) // 涝免仿阑 困茄 喉废阑 啊府虐绰 pointer
{
RIJNDAEL_CIPHER_KEY *RK_Struct=CipherKey;
DWORD *d_key=RK_Struct->RK; // 64 DWORDs
DWORD k_len=RK_Struct->k_len;
u4byte b0[4], b1[4], *kp;
LITTLE_B2D(&(Data[ 0]), b0[0]);
LITTLE_B2D(&(Data[ 4]), b0[1]);
LITTLE_B2D(&(Data[ 8]), b0[2]);
LITTLE_B2D(&(Data[12]), b0[3]);
//
b0[0] ^= d_key[0];
b0[1] ^= d_key[1];
b0[2] ^= d_key[2];
b0[3] ^= d_key[3];
kp = d_key + 4;
switch( k_len ) {
case 8 :
i_nround(b1, b0, kp); i_nround(b0, b1, kp);
case 6 :
i_nround(b1, b0, kp); i_nround(b0, b1, kp);
case 4 :
i_nround(b1, b0, kp); i_nround(b0, b1, kp);
i_nround(b1, b0, kp); i_nround(b0, b1, kp);
i_nround(b1, b0, kp); i_nround(b0, b1, kp);
i_nround(b1, b0, kp); i_nround(b0, b1, kp);
i_nround(b1, b0, kp); i_lround(b0, b1, kp);
}
//
LITTLE_D2B(b0[0], &(Data[ 0]));
LITTLE_D2B(b0[1], &(Data[ 4]));
LITTLE_D2B(b0[2], &(Data[ 8]));
LITTLE_D2B(b0[3], &(Data[12]));
}
/*************** END OF FILE **********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -