📄 aes.cpp
字号:
s1 =
Te0[GETBYTE(t1, 3)] ^
Te1[GETBYTE(t2, 2)] ^
Te2[GETBYTE(t3, 1)] ^
Te3[GETBYTE(t0, 0)] ^
rk[1];
s2 =
Te0[GETBYTE(t2, 3)] ^
Te1[GETBYTE(t3, 2)] ^
Te2[GETBYTE(t0, 1)] ^
Te3[GETBYTE(t1, 0)] ^
rk[2];
s3 =
Te0[GETBYTE(t3, 3)] ^
Te1[GETBYTE(t0, 2)] ^
Te2[GETBYTE(t1, 1)] ^
Te3[GETBYTE(t2, 0)] ^
rk[3];
}
/*
* apply last round and
* map cipher state to byte array block:
*/
s0 =
(Te4[GETBYTE(t0, 3)] & 0xff000000) ^
(Te4[GETBYTE(t1, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t2, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t3, 0)] & 0x000000ff) ^
rk[0];
s1 =
(Te4[GETBYTE(t1, 3)] & 0xff000000) ^
(Te4[GETBYTE(t2, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t3, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t0, 0)] & 0x000000ff) ^
rk[1];
s2 =
(Te4[GETBYTE(t2, 3)] & 0xff000000) ^
(Te4[GETBYTE(t3, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t0, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t1, 0)] & 0x000000ff) ^
rk[2];
s3 =
(Te4[GETBYTE(t3, 3)] & 0xff000000) ^
(Te4[GETBYTE(t0, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t1, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t2, 0)] & 0x000000ff) ^
rk[3];
gpBlock::Put(xorBlock, outBlock)(s0)(s1)(s2)(s3);
}
void AES::decrypt(const byte* inBlock, const byte* xorBlock,
byte* outBlock) const
{
word32 s0, s1, s2, s3;
word32 t0, t1, t2, t3;
const word32* rk = key_;
/*
* map byte array block to cipher state
* and add initial round key:
*/
gpBlock::Get(inBlock)(s0)(s1)(s2)(s3);
s0 ^= rk[0];
s1 ^= rk[1];
s2 ^= rk[2];
s3 ^= rk[3];
/*
* Nr - 1 full rounds:
*/
unsigned int r = rounds_ >> 1;
for (;;) {
t0 =
Td0[GETBYTE(s0, 3)] ^
Td1[GETBYTE(s3, 2)] ^
Td2[GETBYTE(s2, 1)] ^
Td3[GETBYTE(s1, 0)] ^
rk[4];
t1 =
Td0[GETBYTE(s1, 3)] ^
Td1[GETBYTE(s0, 2)] ^
Td2[GETBYTE(s3, 1)] ^
Td3[GETBYTE(s2, 0)] ^
rk[5];
t2 =
Td0[GETBYTE(s2, 3)] ^
Td1[GETBYTE(s1, 2)] ^
Td2[GETBYTE(s0, 1)] ^
Td3[GETBYTE(s3, 0)] ^
rk[6];
t3 =
Td0[GETBYTE(s3, 3)] ^
Td1[GETBYTE(s2, 2)] ^
Td2[GETBYTE(s1, 1)] ^
Td3[GETBYTE(s0, 0)] ^
rk[7];
rk += 8;
if (--r == 0) {
break;
}
s0 =
Td0[GETBYTE(t0, 3)] ^
Td1[GETBYTE(t3, 2)] ^
Td2[GETBYTE(t2, 1)] ^
Td3[GETBYTE(t1, 0)] ^
rk[0];
s1 =
Td0[GETBYTE(t1, 3)] ^
Td1[GETBYTE(t0, 2)] ^
Td2[GETBYTE(t3, 1)] ^
Td3[GETBYTE(t2, 0)] ^
rk[1];
s2 =
Td0[GETBYTE(t2, 3)] ^
Td1[GETBYTE(t1, 2)] ^
Td2[GETBYTE(t0, 1)] ^
Td3[GETBYTE(t3, 0)] ^
rk[2];
s3 =
Td0[GETBYTE(t3, 3)] ^
Td1[GETBYTE(t2, 2)] ^
Td2[GETBYTE(t1, 1)] ^
Td3[GETBYTE(t0, 0)] ^
rk[3];
}
/*
* apply last round and
* map cipher state to byte array block:
*/
s0 =
(Td4[GETBYTE(t0, 3)] & 0xff000000) ^
(Td4[GETBYTE(t3, 2)] & 0x00ff0000) ^
(Td4[GETBYTE(t2, 1)] & 0x0000ff00) ^
(Td4[GETBYTE(t1, 0)] & 0x000000ff) ^
rk[0];
s1 =
(Td4[GETBYTE(t1, 3)] & 0xff000000) ^
(Td4[GETBYTE(t0, 2)] & 0x00ff0000) ^
(Td4[GETBYTE(t3, 1)] & 0x0000ff00) ^
(Td4[GETBYTE(t2, 0)] & 0x000000ff) ^
rk[1];
s2 =
(Td4[GETBYTE(t2, 3)] & 0xff000000) ^
(Td4[GETBYTE(t1, 2)] & 0x00ff0000) ^
(Td4[GETBYTE(t0, 1)] & 0x0000ff00) ^
(Td4[GETBYTE(t3, 0)] & 0x000000ff) ^
rk[2];
s3 =
(Td4[GETBYTE(t3, 3)] & 0xff000000) ^
(Td4[GETBYTE(t2, 2)] & 0x00ff0000) ^
(Td4[GETBYTE(t1, 1)] & 0x0000ff00) ^
(Td4[GETBYTE(t0, 0)] & 0x000000ff) ^
rk[3];
gpBlock::Put(xorBlock, outBlock)(s0)(s1)(s2)(s3);
}
#if defined(DO_AES_ASM)
#ifdef __GNUC__
#define AS1(x) asm(#x);
#define AS2(x, y) asm(#x ", " #y);
#define PROLOG() \
asm(".intel_syntax noprefix"); \
AS2( movd mm3, edi ) \
AS2( movd mm4, ebx ) \
AS2( sub esp, 4 ) \
AS2( movd mm7, ebp ) \
AS2( mov [ebp - 4], esi ) \
AS2( mov ecx, DWORD PTR [ebp + 8] ) \
AS2( mov esi, DWORD PTR [ebp + 12] ) \
AS2( mov ebp, DWORD PTR [ebp + 20] )
#define EPILOG() \
AS2( mov esi, [ebp - 4] ) \
AS2( mov esp, ebp ) \
AS2( movd ebx, mm4 ) \
AS2( movd edi, mm3 ) \
AS1( emms ) \
asm(".att_syntax");
#else
#define AS1(x) __asm x
#define AS2(x, y) __asm x, y
#define PROLOG() \
AS1( push ebp ) \
AS2( mov ebp, esp ) \
AS2( movd mm3, edi ) \
AS2( movd mm4, ebx ) \
AS2( sub esp, 4 ) \
AS2( movd mm7, ebp ) \
AS2( mov [ebp - 4], esi ) \
AS2( mov esi, DWORD PTR [ebp + 8] ) \
AS2( mov ebp, DWORD PTR [ebp + 16] )
// ebp is restored at end
#define EPILOG() \
AS2( mov esi, [ebp - 4] ) \
AS2( movd ebx, mm4 ) \
AS2( movd edi, mm3 ) \
AS2( mov esp, ebp ) \
AS1( pop ebp ) \
AS1( emms ) \
AS1( ret 12 )
#endif
#ifdef _MSC_VER
__declspec(naked)
#endif
void AES::AsmEncrypt(const byte* inBlock, byte* outBlock, void* boxes) const
{
PROLOG()
#ifdef OLD_GCC_OFFSET
AS2( mov edx, DWORD PTR [ecx + 60] ) // rounds
AS2( lea edi, [ecx + 64] ) // rk
#else
AS2( mov edx, DWORD PTR [ecx + 56] ) // rounds
AS2( lea edi, [ecx + 60] ) // rk
#endif
AS1( dec edx )
AS2( movd mm6, edi ) // save rk
AS2( movd mm5, edx ) // save rounds
AS2( mov eax, DWORD PTR [esi] )
AS2( mov ebx, DWORD PTR [esi + 4] )
AS2( mov ecx, DWORD PTR [esi + 8] )
AS2( mov edx, DWORD PTR [esi + 12] )
AS1( bswap eax )
AS1( bswap ebx )
AS1( bswap ecx )
AS1( bswap edx )
AS2( xor eax, DWORD PTR [edi] ) // s0
AS2( xor ebx, DWORD PTR [edi + 4] ) // s1
AS2( xor ecx, DWORD PTR [edi + 8] ) // s2
AS2( xor edx, DWORD PTR [edi + 12] ) // s3
AS1(loop1: )
/* Put0 (mm0) =
Te0[get0,rs 24] ^
Te1[get1,rs 16] ^
Te2[get2,rs 8] ^
Te3[get3,rs 0]
*/
AS2( mov esi, eax )
AS2( shr esi, 24 )
AS2( mov esi, DWORD PTR [ebp + esi*4] )
AS2( mov edi, ebx )
AS2( shr edi, 16 )
AS2( and edi, 255 )
AS2( xor esi, DWORD PTR [ebp + 1024 + edi*4] )
AS2( movzx edi, ch )
AS2( xor esi, DWORD PTR [ebp + 2048 + edi*4] )
AS2( movzx edi, dl )
AS2( xor esi, DWORD PTR [ebp + 3072 + edi*4] )
AS2( movd mm0, esi )
/* Put1 (mm1) =
Te0[get1,rs 24] ^
Te1[get2,rs 16] ^
Te2[get3,rs 8] ^
Te3[get0,rs 0]
*/
AS2( mov esi, ebx )
AS2( shr esi, 24 )
AS2( mov esi, DWORD PTR [ebp + esi*4] )
AS2( mov edi, ecx )
AS2( shr edi, 16 )
AS2( and edi, 255 )
AS2( xor esi, DWORD PTR [ebp + 1024 + edi*4] )
AS2( movzx edi, dh )
AS2( xor esi, DWORD PTR [ebp + 2048 + edi*4] )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -