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

📄 aes.cpp

📁 内详 请读者自行阅读本人第一次上载
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          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 + -