⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes.cpp

📁 一个不错的关于手机模块程序This page contains everything that has changed in the history of DC++. Read this to fin
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        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 + -