<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    AES 有哪些模塊組成

    aes

    發現錯別字 1年前 提問
    回答
    1
    瀏覽
    612
    請勿發布不友善或者負能量的內容。與人為善,比聰明更重要!
    回答數量: 1

    AES結構由以下4個不同模塊組成:

    • 字節代替:使用一個表(被稱為S盒)對分組進行逐一字節替換。S盒是AES算法定義的矩陣,把State中每個字節的高4位作為行值,低4位作為列值,然后取出S一盒中對應行列的元素作為輸出。這個步驟提供了AES算法加密的非線性變換能力。S盒與有限域乘法逆元有關,具有良好的非線性特性。為了避免簡單代數攻擊,S盒結合了乘法逆元及可逆的仿射變換矩陣建構而成。

    • 行移位:行移位變換完成基于行的循環移位操作,變換方法為第0行不變,第1行循環左移1個字節,第2行循環左移兩個字節,第3行循環左移3個字節,代碼如下;

    int a[4][4] = {
        {0x87, 0xF2, 0x4D, 0x97},
        {0xEC, 0x6E, 0x4C, 0x90},
        {0x4A, 0xC3, 0x46, 0xE7},
        {0x8C, 0xD8, 0x95, 0xA6}
    };
    int b[4][4];//行移位后的矩陣
    
    int main() {
        //行移位
        for(int i=0;i<=3;i++)
            for(int j=0;j<=3;j++)
                b[i][j] = a[i][(i+j)%4];
        for(int i=0;i<=3;i++) {
            for(int j=0;j<=3;j++) {
                cout<<hex<<b[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    • 列混淆:一般是將兩個不同的矩陣相乘來實現列混淆,代碼如下;
    int mul_mat(int x,int y) {
        if(x == 0x01) {
            return y;
        }
        else if(x == 0x02) {
            if((y&128) != 128) { //二進制首位為0
                return y<<1;
            }
            else {
                int temp = ((y<<1)&((1<<8)-1)); //向左移一位,刪掉最高位(保留8位)
                return temp^(0x1b);
            }
        }
        else if(x == 0x03) {
            return mul_mat(0x02,y)^y;
        }
    }
    • 輪密鑰加:用輪密鑰矩陣的第 i 列,與上面得到的列混淆矩陣的第 i 列進行異或運算,得到最后的矩陣就是輪密鑰加,代碼如下。
    for(int i=0;i<=3;i++) {
            for(int j=0;j<=3;j++) {
                res[j][i] = resMix[j][i] ^ round_key[j][i];
            }
        }

    回答所涉及的環境:聯想天逸510S、Windows 10。

    1年前 / 評論
    亚洲 欧美 自拍 唯美 另类