rijndael.java

来自「jpeg2000编解码」· Java 代码 · 共 565 行 · 第 1/2 页

JAVA
565
字号
        out[outOffset++] = (byte)(S[(t0       ) & 0xFF] ^ (tt       ));        tt = K[keyOffset++];        out[outOffset++] = (byte)(S[(t2 >>> 24)       ] ^ (tt >>> 24));        out[outOffset++] = (byte)(S[(t3 >>> 16) & 0xFF] ^ (tt >>> 16));        out[outOffset++] = (byte)(S[(t0 >>>  8) & 0xFF] ^ (tt >>>  8));        out[outOffset++] = (byte)(S[(t1       ) & 0xFF] ^ (tt       ));        tt = K[keyOffset++];        out[outOffset++] = (byte)(S[(t3 >>> 24)       ] ^ (tt >>> 24));        out[outOffset++] = (byte)(S[(t0 >>> 16) & 0xFF] ^ (tt >>> 16));        out[outOffset++] = (byte)(S[(t1 >>>  8) & 0xFF] ^ (tt >>>  8));        out[outOffset  ] = (byte)(S[(t2       ) & 0xFF] ^ (tt       ));    }    /**     * Decrypt exactly one block of plaintext.     */    private void     blockDecrypt(byte[] in, int inOffset, byte[] out, int outOffset) {        int keyOffset = 8;        int t0, t1, t2, t3, a0, a1, a2;        t0 = ((in[inOffset++]       ) << 24 |              (in[inOffset++] & 0xFF) << 16 |              (in[inOffset++] & 0xFF) <<  8 |              (in[inOffset++] & 0xFF)        ) ^ K[4];        t1 = ((in[inOffset++]       ) << 24 |              (in[inOffset++] & 0xFF) << 16 |              (in[inOffset++] & 0xFF) <<  8 |              (in[inOffset++] & 0xFF)        ) ^ K[5];        t2 = ((in[inOffset++]       ) << 24 |              (in[inOffset++] & 0xFF) << 16 |              (in[inOffset++] & 0xFF) <<  8 |              (in[inOffset++] & 0xFF)        ) ^ K[6];        t3 = ((in[inOffset++]       ) << 24 |              (in[inOffset++] & 0xFF) << 16 |              (in[inOffset++] & 0xFF) <<  8 |              (in[inOffset  ] & 0xFF)        ) ^ K[7];        if(ROUNDS_12) {            a0 = T5[(t0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^                 T7[(t2>>> 8)&0xFF] ^ T8[(t1     )&0xFF] ^ K[keyOffset++];            a1 = T5[(t1>>>24)     ] ^ T6[(t0>>>16)&0xFF] ^                 T7[(t3>>> 8)&0xFF] ^ T8[(t2     )&0xFF] ^ K[keyOffset++];            a2 = T5[(t2>>>24)     ] ^ T6[(t1>>>16)&0xFF] ^                 T7[(t0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];            t3 = T5[(t3>>>24)     ] ^ T6[(t2>>>16)&0xFF] ^                 T7[(t1>>> 8)&0xFF] ^ T8[(t0     )&0xFF] ^ K[keyOffset++];            t0 = T5[(a0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^                 T7[(a2>>> 8)&0xFF] ^ T8[(a1     )&0xFF] ^ K[keyOffset++];            t1 = T5[(a1>>>24)     ] ^ T6[(a0>>>16)&0xFF] ^                 T7[(t3>>> 8)&0xFF] ^ T8[(a2     )&0xFF] ^ K[keyOffset++];            t2 = T5[(a2>>>24)     ] ^ T6[(a1>>>16)&0xFF] ^                 T7[(a0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];            t3 = T5[(t3>>>24)     ] ^ T6[(a2>>>16)&0xFF] ^                 T7[(a1>>> 8)&0xFF] ^ T8[(a0     )&0xFF] ^ K[keyOffset++];            if(ROUNDS_14) {                a0 = T5[(t0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^                     T7[(t2>>> 8)&0xFF] ^ T8[(t1     )&0xFF] ^ K[keyOffset++];                a1 = T5[(t1>>>24)     ] ^ T6[(t0>>>16)&0xFF] ^                     T7[(t3>>> 8)&0xFF] ^ T8[(t2     )&0xFF] ^ K[keyOffset++];                a2 = T5[(t2>>>24)     ] ^ T6[(t1>>>16)&0xFF] ^                     T7[(t0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];                t3 = T5[(t3>>>24)     ] ^ T6[(t2>>>16)&0xFF] ^                     T7[(t1>>> 8)&0xFF] ^ T8[(t0     )&0xFF] ^ K[keyOffset++];                t0 = T5[(a0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^                     T7[(a2>>> 8)&0xFF] ^ T8[(a1     )&0xFF] ^ K[keyOffset++];                t1 = T5[(a1>>>24)     ] ^ T6[(a0>>>16)&0xFF] ^                     T7[(t3>>> 8)&0xFF] ^ T8[(a2     )&0xFF] ^ K[keyOffset++];                t2 = T5[(a2>>>24)     ] ^ T6[(a1>>>16)&0xFF] ^                     T7[(a0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];                t3 = T5[(t3>>>24)     ] ^ T6[(a2>>>16)&0xFF] ^                     T7[(a1>>> 8)&0xFF] ^ T8[(a0     )&0xFF] ^ K[keyOffset++];            }        }        a0 = T5[(t0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(t2>>> 8)&0xFF] ^ T8[(t1     )&0xFF] ^ K[keyOffset++];        a1 = T5[(t1>>>24)     ] ^ T6[(t0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(t2     )&0xFF] ^ K[keyOffset++];        a2 = T5[(t2>>>24)     ] ^ T6[(t1>>>16)&0xFF] ^             T7[(t0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(t2>>>16)&0xFF] ^             T7[(t1>>> 8)&0xFF] ^ T8[(t0     )&0xFF] ^ K[keyOffset++];        t0 = T5[(a0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(a2>>> 8)&0xFF] ^ T8[(a1     )&0xFF] ^ K[keyOffset++];        t1 = T5[(a1>>>24)     ] ^ T6[(a0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(a2     )&0xFF] ^ K[keyOffset++];        t2 = T5[(a2>>>24)     ] ^ T6[(a1>>>16)&0xFF] ^             T7[(a0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(a2>>>16)&0xFF] ^             T7[(a1>>> 8)&0xFF] ^ T8[(a0     )&0xFF] ^ K[keyOffset++];        a0 = T5[(t0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(t2>>> 8)&0xFF] ^ T8[(t1     )&0xFF] ^ K[keyOffset++];        a1 = T5[(t1>>>24)     ] ^ T6[(t0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(t2     )&0xFF] ^ K[keyOffset++];        a2 = T5[(t2>>>24)     ] ^ T6[(t1>>>16)&0xFF] ^             T7[(t0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(t2>>>16)&0xFF] ^             T7[(t1>>> 8)&0xFF] ^ T8[(t0     )&0xFF] ^ K[keyOffset++];        t0 = T5[(a0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(a2>>> 8)&0xFF] ^ T8[(a1     )&0xFF] ^ K[keyOffset++];        t1 = T5[(a1>>>24)     ] ^ T6[(a0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(a2     )&0xFF] ^ K[keyOffset++];        t2 = T5[(a2>>>24)     ] ^ T6[(a1>>>16)&0xFF] ^             T7[(a0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(a2>>>16)&0xFF] ^             T7[(a1>>> 8)&0xFF] ^ T8[(a0     )&0xFF] ^ K[keyOffset++];        a0 = T5[(t0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(t2>>> 8)&0xFF] ^ T8[(t1     )&0xFF] ^ K[keyOffset++];        a1 = T5[(t1>>>24)     ] ^ T6[(t0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(t2     )&0xFF] ^ K[keyOffset++];        a2 = T5[(t2>>>24)     ] ^ T6[(t1>>>16)&0xFF] ^             T7[(t0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(t2>>>16)&0xFF] ^             T7[(t1>>> 8)&0xFF] ^ T8[(t0     )&0xFF] ^ K[keyOffset++];        t0 = T5[(a0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(a2>>> 8)&0xFF] ^ T8[(a1     )&0xFF] ^ K[keyOffset++];        t1 = T5[(a1>>>24)     ] ^ T6[(a0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(a2     )&0xFF] ^ K[keyOffset++];        t2 = T5[(a2>>>24)     ] ^ T6[(a1>>>16)&0xFF] ^             T7[(a0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(a2>>>16)&0xFF] ^             T7[(a1>>> 8)&0xFF] ^ T8[(a0     )&0xFF] ^ K[keyOffset++];        a0 = T5[(t0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(t2>>> 8)&0xFF] ^ T8[(t1     )&0xFF] ^ K[keyOffset++];        a1 = T5[(t1>>>24)     ] ^ T6[(t0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(t2     )&0xFF] ^ K[keyOffset++];        a2 = T5[(t2>>>24)     ] ^ T6[(t1>>>16)&0xFF] ^             T7[(t0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(t2>>>16)&0xFF] ^             T7[(t1>>> 8)&0xFF] ^ T8[(t0     )&0xFF] ^ K[keyOffset++];        t0 = T5[(a0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(a2>>> 8)&0xFF] ^ T8[(a1     )&0xFF] ^ K[keyOffset++];        t1 = T5[(a1>>>24)     ] ^ T6[(a0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(a2     )&0xFF] ^ K[keyOffset++];        t2 = T5[(a2>>>24)     ] ^ T6[(a1>>>16)&0xFF] ^             T7[(a0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(a2>>>16)&0xFF] ^             T7[(a1>>> 8)&0xFF] ^ T8[(a0     )&0xFF] ^ K[keyOffset++];        a0 = T5[(t0>>>24)     ] ^ T6[(t3>>>16)&0xFF] ^             T7[(t2>>> 8)&0xFF] ^ T8[(t1     )&0xFF] ^ K[keyOffset++];        a1 = T5[(t1>>>24)     ] ^ T6[(t0>>>16)&0xFF] ^             T7[(t3>>> 8)&0xFF] ^ T8[(t2     )&0xFF] ^ K[keyOffset++];        a2 = T5[(t2>>>24)     ] ^ T6[(t1>>>16)&0xFF] ^             T7[(t0>>> 8)&0xFF] ^ T8[(t3     )&0xFF] ^ K[keyOffset++];        t3 = T5[(t3>>>24)     ] ^ T6[(t2>>>16)&0xFF] ^             T7[(t1>>> 8)&0xFF] ^ T8[(t0     )&0xFF] ^ K[keyOffset++];        t1 = K[0];        out[outOffset++] = (byte)(Si[(a0 >>> 24)       ] ^ (t1 >>> 24));        out[outOffset++] = (byte)(Si[(t3 >>> 16) & 0xFF] ^ (t1 >>> 16));        out[outOffset++] = (byte)(Si[(a2 >>>  8) & 0xFF] ^ (t1 >>>  8));        out[outOffset++] = (byte)(Si[(a1       ) & 0xFF] ^ (t1       ));        t1 = K[1];        out[outOffset++] = (byte)(Si[(a1 >>> 24)       ] ^ (t1 >>> 24));        out[outOffset++] = (byte)(Si[(a0 >>> 16) & 0xFF] ^ (t1 >>> 16));        out[outOffset++] = (byte)(Si[(t3 >>>  8) & 0xFF] ^ (t1 >>>  8));        out[outOffset++] = (byte)(Si[(a2       ) & 0xFF] ^ (t1       ));        t1 = K[2];        out[outOffset++] = (byte)(Si[(a2 >>> 24)       ] ^ (t1 >>> 24));        out[outOffset++] = (byte)(Si[(a1 >>> 16) & 0xFF] ^ (t1 >>> 16));        out[outOffset++] = (byte)(Si[(a0 >>>  8) & 0xFF] ^ (t1 >>>  8));        out[outOffset++] = (byte)(Si[(t3       ) & 0xFF] ^ (t1       ));        t1 = K[3];        out[outOffset++] = (byte)(Si[(t3 >>> 24)       ] ^ (t1 >>> 24));        out[outOffset++] = (byte)(Si[(a2 >>> 16) & 0xFF] ^ (t1 >>> 16));        out[outOffset++] = (byte)(Si[(a1 >>>  8) & 0xFF] ^ (t1 >>>  8));        out[outOffset  ] = (byte)(Si[(a0       ) & 0xFF] ^ (t1       ));    }    /**     * Expand a user-supplied key material into a session key.     *     * @param key The 128/192/256-bit user-key to use.     * @exception InvalidKeyException  If the key is invalid.     */    private static int[] makeKey( byte[] keyBytes, boolean decrypt )    throws InvalidKeyException     {        int ROUNDS          = getRounds(keyBytes.length);        int ROUND_KEY_COUNT = (ROUNDS + 1) * 4;        int[] K = new int[ROUND_KEY_COUNT];        int KC = keyBytes.length / 4; // keylen in 32-bit elements        int[] tk = new int[KC];        int i, j;        // copy user material bytes into temporary ints        for (i = 0, j = 0; i < KC; )            tk[i++] = (keyBytes[j++]       ) << 24 |                      (keyBytes[j++] & 0xFF) << 16 |                      (keyBytes[j++] & 0xFF) <<  8 |                      (keyBytes[j++] & 0xFF);        // copy values into round key arrays        int t = 0;        for ( ; t < KC; t++) K[t] = tk[t];        int tt, rconpointer = 0;        while (t < ROUND_KEY_COUNT) {            // extrapolate using phi (the round key evolution function)            tt = tk[KC - 1];            tk[0] ^= (S[(tt >>> 16) & 0xFF]       ) << 24 ^                     (S[(tt >>>  8) & 0xFF] & 0xFF) << 16 ^                     (S[(tt       ) & 0xFF] & 0xFF) <<  8 ^                     (S[(tt >>> 24)       ] & 0xFF)       ^                     (rcon[rconpointer++]         ) << 24;            if (KC != 8)                for (i = 1, j = 0; i < KC; ) tk[i++] ^= tk[j++];            else {                for (i = 1, j = 0; i < KC / 2; ) tk[i++] ^= tk[j++];                tt = tk[KC / 2 - 1];                tk[KC / 2] ^= (S[(tt       ) & 0xFF] & 0xFF)       ^                              (S[(tt >>>  8) & 0xFF] & 0xFF) <<  8 ^                              (S[(tt >>> 16) & 0xFF] & 0xFF) << 16 ^                              (S[(tt >>> 24)       ]       ) << 24;                for (j = KC / 2, i = j + 1; i < KC; ) tk[i++] ^= tk[j++];            }            // copy values into round key arrays            for (j = 0; (j < KC) && (t < ROUND_KEY_COUNT); j++, t++)                K[t] = tk[j];        }        return K;    }    private static void invertKey(int[] K) {        for(int i=0; i<K.length/2-4;i+=4) {            int jj0 = K[i+0];            int jj1 = K[i+1];            int jj2 = K[i+2];            int jj3 = K[i+3];            K[i+0] = K[K.length-i-4+0];            K[i+1] = K[K.length-i-4+1];            K[i+2] = K[K.length-i-4+2];            K[i+3] = K[K.length-i-4+3];            K[K.length-i-4+0] = jj0;            K[K.length-i-4+1] = jj1;            K[K.length-i-4+2] = jj2;            K[K.length-i-4+3] = jj3;        }                for (int r = 4; r < K.length-4; r++) {            int tt = K[r];            K[r] = U1[(tt >>> 24) & 0xFF] ^                   U2[(tt >>> 16) & 0xFF] ^                   U3[(tt >>>  8) & 0xFF] ^                   U4[ tt         & 0xFF];        }        int j0 = K[K.length-4];        int j1 = K[K.length-3];        int j2 = K[K.length-2];        int j3 = K[K.length-1];        for( int i=K.length-1; i>3; i-- ) K[i] = K[i-4];        K[0] = j0;        K[1] = j1;        K[2] = j2;        K[3] = j3;    }    /**     * Return The number of rounds for a given Rijndael keysize.     *     * @param keySize  The size of the user key material in bytes.     *                 MUST be one of (16, 24, 32).     * @return         The number of rounds.     */    private static int getRounds( int keySize ) {        return (keySize >> 2) + 6;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?