CSPspEmu.Core.Crypto.Crypto.rijndaelDecrypt C# (CSharp) Метод

rijndaelDecrypt() публичный статический Метод

public static rijndaelDecrypt ( uint rk, int Nr, byte ct, byte pt ) : void
rk uint
Nr int
ct byte
pt byte
Результат void
        public static void rijndaelDecrypt(uint* rk /*4*(Nr + 1)*/, int Nr, byte* ct, byte *pt)
        {
            uint s0, s1, s2, s3, t0, t1, t2, t3;
            #if !FULL_UNROLL
            int r;
            #endif

            // map byte array block to cipher state
            // and add initial round key:
            s0 = GETuint(ct     ) ^ rk[0];
            s1 = GETuint(ct +  4) ^ rk[1];
            s2 = GETuint(ct +  8) ^ rk[2];
            s3 = GETuint(ct + 12) ^ rk[3];
            #if FULL_UNROLL
            /* round 1: */
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
            /* round 2: */
            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
            /* round 3: */
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
            /* round 4: */
            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
            /* round 5: */
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
            /* round 6: */
            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
            /* round 7: */
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
            /* round 8: */
            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
            /* round 9: */
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
            if (Nr > 10) {
            /* round 10: */
            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
            /* round 11: */
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
            if (Nr > 12) {
                /* round 12: */
                s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
                s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
                s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
                s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
                /* round 13: */
                t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
                t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
                t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
                t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
            }
            }
            rk += Nr << 2;
            #else
            /*
             * Nr - 1 full rounds:
             */
            r = Nr >> 1;
            for (;;) {
            t0 =
                Td0[(s0 >> 24)       ] ^
                Td1[(s3 >> 16) & 0xff] ^
                Td2[(s2 >>  8) & 0xff] ^
                Td3[(s1      ) & 0xff] ^
                rk[4];
            t1 =
                Td0[(s1 >> 24)       ] ^
                Td1[(s0 >> 16) & 0xff] ^
                Td2[(s3 >>  8) & 0xff] ^
                Td3[(s2      ) & 0xff] ^
                rk[5];
            t2 =
                Td0[(s2 >> 24)       ] ^
                Td1[(s1 >> 16) & 0xff] ^
                Td2[(s0 >>  8) & 0xff] ^
                Td3[(s3      ) & 0xff] ^
                rk[6];
            t3 =
                Td0[(s3 >> 24)       ] ^
                Td1[(s2 >> 16) & 0xff] ^
                Td2[(s1 >>  8) & 0xff] ^
                Td3[(s0      ) & 0xff] ^
                rk[7];

            rk += 8;
            if (--r == 0) {
                break;
            }

            s0 =
                Td0[(t0 >> 24)       ] ^
                Td1[(t3 >> 16) & 0xff] ^
                Td2[(t2 >>  8) & 0xff] ^
                Td3[(t1      ) & 0xff] ^
                rk[0];
            s1 =
                Td0[(t1 >> 24)       ] ^
                Td1[(t0 >> 16) & 0xff] ^
                Td2[(t3 >>  8) & 0xff] ^
                Td3[(t2      ) & 0xff] ^
                rk[1];
            s2 =
                Td0[(t2 >> 24)       ] ^
                Td1[(t1 >> 16) & 0xff] ^
                Td2[(t0 >>  8) & 0xff] ^
                Td3[(t3      ) & 0xff] ^
                rk[2];
            s3 =
                Td0[(t3 >> 24)       ] ^
                Td1[(t2 >> 16) & 0xff] ^
                Td2[(t1 >>  8) & 0xff] ^
                Td3[(t0      ) & 0xff] ^
                rk[3];
            }
            #endif
            /*
             * apply last round and
             * map cipher state to byte array block:
             */
            s0 =
                (Td4[(t0 >> 24)       ] & 0xff000000) ^
                (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
                (Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
                (Td4[(t1      ) & 0xff] & 0x000000ff) ^
                rk[0];
            PUTuint(pt     , s0);
            s1 =
                (Td4[(t1 >> 24)       ] & 0xff000000) ^
                (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
                (Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
                (Td4[(t2      ) & 0xff] & 0x000000ff) ^
                rk[1];
            PUTuint(pt +  4, s1);
            s2 =
                (Td4[(t2 >> 24)       ] & 0xff000000) ^
                (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
                (Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
                (Td4[(t3      ) & 0xff] & 0x000000ff) ^
                rk[2];
            PUTuint(pt +  8, s2);
            s3 =
                (Td4[(t3 >> 24)       ] & 0xff000000) ^
                (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
                (Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
                (Td4[(t0      ) & 0xff] & 0x000000ff) ^
                rk[3];
            PUTuint(pt + 12, s3);
        }