📄 aes.cpp
字号:
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) #endifvoid 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] ) AS2( movzx edi, al ) AS2( xor esi, DWORD PTR [ebp + 3072 + edi*4] ) AS2( movd mm1, esi ) /* Put2 (mm2) = Te0[get2,rs 24] ^ Te1[get3,rs 16] ^ Te2[get0,rs 8] ^ Te3[get1,rs 0] */ AS2( mov esi, ecx ) AS2( shr esi, 24 ) AS2( mov esi, DWORD PTR [ebp + esi*4] )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -