AES算法

发布时间 2023-04-09 18:24:27作者: Q生

 

(一)设计思路(可包含部分关键代码说明)

  /*通过密钥计算规则计算余下数组

         *

         *1.如果i不是4的倍数,那么第i列由如下等式确定:

         *W[i]=W[i-4]W[i-1]

         *2.如果i4的倍数,那么第i列由如下等式确定:

         *W[i]=W[i-4]T(W[i-1])

         *其中,T是一个有点复杂的函数。函数T3部分组成:字循环(每次循环一位)、字节代换(s盒)和轮常量异或。

         */

 

        for (i = 4; i < 44; i++) {

            temp = word[i - 1];//看作W[i-1]

            if (i % 4 == 0) { //i4的倍数 进入函数运算 W[i-1]=T(W[i-1])

                temp = subWord(rotWord(temp));

                temp[0] = temp[0] ^ RCon[i / 4 - 1];

            }

            for (j = 0; j < 4; j++) {

                word[i][j] = word[i - 4][j] ^ temp[j];//相当于W[i]=W[i-4]W[i-1]

            }

        }

 

}

 //密钥扩展中的移位

    static int[] rotWord(int[] word) {

        int[] rot = new int[4];

        int i;

        for (i = 0; i < 4; i++) {

            rot[i] = word[(i + 1) % 4];

        }

        return rot;

    }

 

    //密钥扩展中的4个字节的代换(4个字节为一组) 例如 A2 BE C4 D5

    static int[] subWord(int[] word) {

        int sub[] = new int[4];

        int i;

        for (i = 0; i < 4; i++) {

            sub[i] = subByte(word[i]);

        }

        return sub;

    }

 

    //S盒的单个字节代换 例如 AE

    static int subByte(int w) {

        int x = w / 16;

        int y = w % 16;

        return sbox[x * 16 + y];

    }

 

    //轮密钥加

    static int[] addRoundKey(int[] text, int round) {

        int[] add = new int[16];

        int i, j;

        for (i = 0; i < 4; i++) {

            for (j = 0; j < 4; j++) {

                //System.out.print(Integer.toHexString(word[4 * round + i][j]) + ",");//round轮的轮密钥

                add[4 * i + j] = text[4 * i + j] ^ word[4 * round + i][j]; //逐比特异或

            }

 

 

        }

        return add;

    }

 

    //行移位(循环移位)规则:第0行移0位  .....  3行移3

    static int[] shiftRows(int[] text) {

        int[] shift = new int[16];

        int i, j;

        for (i = 0; i < 4; i++) {

            for (j = 0; j < 4; j++) {

                shift[4 * i + j] = text[4 * ((i + j) % 4) + j];

            }

        }

        return shift;

    }

 

    //列混合

    static int[] mixColumn(int[] text) {

        int[] mix = new int[16];

        int[] mass = {2, 3, 1, 1};

        int i, j, u;

        for (i = 0; i < 16; i++) {

            u = 0;

            for (j = 0; j < 4; j++) {

                u = u ^ fieldMulit(text[(i / 4) * 4 + j], mass[(4 - i % 4 + j) % 4]);

            }

            mix[i] = u;

        }

        return mix;

    }