Shift() private static méthode

private static Shift ( uint r, int shift ) : uint
r uint
shift int
Résultat uint
Exemple #1
0
        // Token: 0x06000122 RID: 290 RVA: 0x0000936C File Offset: 0x0000756C
        private static uint Inv_Mcol(uint x)
        {
            uint num  = x ^ AesEngine.Shift(x, 8);
            uint num2 = x ^ AesEngine.FFmulX(num);

            num ^= AesEngine.FFmulX2(num2);
            return(num2 ^ (num ^ AesEngine.Shift(num, 16)));
        }
Exemple #2
0
        private static uint Inv_Mcol(uint x)
        {
            uint num  = AesEngine.FFmulX(x);
            uint num2 = AesEngine.FFmulX(num);
            uint num3 = AesEngine.FFmulX(num2);
            uint num4 = x ^ num3;

            return(num ^ num2 ^ num3 ^ AesEngine.Shift(num ^ num4, 8) ^ AesEngine.Shift(num2 ^ num4, 16) ^ AesEngine.Shift(num4, 24));
        }
Exemple #3
0
        private uint[][] GenerateWorkingKey(byte[] key, bool forEncryption)
        {
            int num = key.Length / 4;

            if (num != 4 && num != 6 && num != 8)
            {
                throw new ArgumentException("Key length not 128/192/256 bits.");
            }
            this.ROUNDS = num + 6;
            uint[][] array = new uint[this.ROUNDS + 1][];
            for (int i = 0; i <= this.ROUNDS; i++)
            {
                array[i] = new uint[4];
            }
            int num2 = 0;
            int j    = 0;

            while (j < key.Length)
            {
                array[num2 >> 2][num2 & 3] = Pack.LE_To_UInt32(key, j);
                j += 4;
                num2++;
            }
            int num3 = this.ROUNDS + 1 << 2;

            for (int k = num; k < num3; k++)
            {
                uint num4 = array[k - 1 >> 2][k - 1 & 3];
                if (k % num == 0)
                {
                    num4 = (AesEngine.SubWord(AesEngine.Shift(num4, 8)) ^ (uint)AesEngine.rcon[k / num - 1]);
                }
                else if (num > 6 && k % num == 4)
                {
                    num4 = AesEngine.SubWord(num4);
                }
                array[k >> 2][k & 3] = (array[k - num >> 2][k - num & 3] ^ num4);
            }
            if (!forEncryption)
            {
                for (int l = 1; l < this.ROUNDS; l++)
                {
                    uint[] array2 = array[l];
                    for (int m = 0; m < 4; m++)
                    {
                        array2[m] = AesEngine.Inv_Mcol(array2[m]);
                    }
                }
            }
            return(array);
        }
Exemple #4
0
        // Token: 0x0600012F RID: 303 RVA: 0x0000A0A4 File Offset: 0x000082A4
        private void DecryptBlock(uint[][] KW)
        {
            uint[] array = KW[this.ROUNDS];
            uint   num   = this.C0 ^ array[0];
            uint   num2  = this.C1 ^ array[1];
            uint   num3  = this.C2 ^ array[2];
            uint   num4  = this.C3 ^ array[3];
            int    i     = this.ROUNDS - 1;
            uint   num5;
            uint   num6;
            uint   num7;

            while (i > 1)
            {
                array = KW[i--];
                num5  = (AesEngine.Tinv0[(int)(num & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num3 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num2 >> 24 & 255U)], 8) ^ array[0]);
                num6  = (AesEngine.Tinv0[(int)(num2 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num3 >> 24 & 255U)], 8) ^ array[1]);
                num7  = (AesEngine.Tinv0[(int)(num3 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num2 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 24 & 255U)], 8) ^ array[2]);
                num4  = (AesEngine.Tinv0[(int)(num4 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num3 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num2 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num >> 24 & 255U)], 8) ^ array[3]);
                array = KW[i--];
                num   = (AesEngine.Tinv0[(int)(num5 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num7 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num6 >> 24 & 255U)], 8) ^ array[0]);
                num2  = (AesEngine.Tinv0[(int)(num6 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num5 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num7 >> 24 & 255U)], 8) ^ array[1]);
                num3  = (AesEngine.Tinv0[(int)(num7 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num6 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num5 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 24 & 255U)], 8) ^ array[2]);
                num4  = (AesEngine.Tinv0[(int)(num4 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num7 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num6 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num5 >> 24 & 255U)], 8) ^ array[3]);
            }
            array   = KW[1];
            num5    = (AesEngine.Tinv0[(int)(num & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num3 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num2 >> 24 & 255U)], 8) ^ array[0]);
            num6    = (AesEngine.Tinv0[(int)(num2 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num3 >> 24 & 255U)], 8) ^ array[1]);
            num7    = (AesEngine.Tinv0[(int)(num3 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num2 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num4 >> 24 & 255U)], 8) ^ array[2]);
            num4    = (AesEngine.Tinv0[(int)(num4 & 255U)] ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num3 >> 8 & 255U)], 24) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num2 >> 16 & 255U)], 16) ^ AesEngine.Shift(AesEngine.Tinv0[(int)(num >> 24 & 255U)], 8) ^ array[3]);
            array   = KW[0];
            this.C0 = (uint)((int)AesEngine.Si[(int)(num5 & 255U)] ^ (int)this.s[(int)(num4 >> 8 & 255U)] << 8 ^ (int)this.s[(int)(num7 >> 16 & 255U)] << 16 ^ (int)AesEngine.Si[(int)(num6 >> 24 & 255U)] << 24 ^ (int)array[0]);
            this.C1 = (uint)((int)this.s[(int)(num6 & 255U)] ^ (int)this.s[(int)(num5 >> 8 & 255U)] << 8 ^ (int)AesEngine.Si[(int)(num4 >> 16 & 255U)] << 16 ^ (int)this.s[(int)(num7 >> 24 & 255U)] << 24 ^ (int)array[1]);
            this.C2 = (uint)((int)this.s[(int)(num7 & 255U)] ^ (int)AesEngine.Si[(int)(num6 >> 8 & 255U)] << 8 ^ (int)AesEngine.Si[(int)(num5 >> 16 & 255U)] << 16 ^ (int)this.s[(int)(num4 >> 24 & 255U)] << 24 ^ (int)array[2]);
            this.C3 = (uint)((int)AesEngine.Si[(int)(num4 & 255U)] ^ (int)this.s[(int)(num7 >> 8 & 255U)] << 8 ^ (int)this.s[(int)(num6 >> 16 & 255U)] << 16 ^ (int)this.s[(int)(num5 >> 24 & 255U)] << 24 ^ (int)array[3]);
        }
Exemple #5
0
        private void EncryptBlock(uint[][] KW)
        {
            uint[] array = KW[0];
            uint   num   = this.C0 ^ array[0];
            uint   num2  = this.C1 ^ array[1];
            uint   num3  = this.C2 ^ array[2];
            uint   num4  = this.C3 ^ array[3];
            int    i     = 1;
            uint   num5;
            uint   num6;
            uint   num7;

            while (i < this.ROUNDS - 1)
            {
                array = KW[i++];
                num5  = (AesEngine.T0[(int)((UIntPtr)(num & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num2 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num3 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 24 & 255u))], 8) ^ array[0]);
                num6  = (AesEngine.T0[(int)((UIntPtr)(num2 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num3 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num >> 24 & 255u))], 8) ^ array[1]);
                num7  = (AesEngine.T0[(int)((UIntPtr)(num3 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num2 >> 24 & 255u))], 8) ^ array[2]);
                num4  = (AesEngine.T0[(int)((UIntPtr)(num4 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num2 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num3 >> 24 & 255u))], 8) ^ array[3]);
                array = KW[i++];
                num   = (AesEngine.T0[(int)((UIntPtr)(num5 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num6 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num7 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 24 & 255u))], 8) ^ array[0]);
                num2  = (AesEngine.T0[(int)((UIntPtr)(num6 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num7 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num5 >> 24 & 255u))], 8) ^ array[1]);
                num3  = (AesEngine.T0[(int)((UIntPtr)(num7 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num5 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num6 >> 24 & 255u))], 8) ^ array[2]);
                num4  = (AesEngine.T0[(int)((UIntPtr)(num4 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num5 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num6 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num7 >> 24 & 255u))], 8) ^ array[3]);
            }
            array   = KW[i++];
            num5    = (AesEngine.T0[(int)((UIntPtr)(num & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num2 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num3 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 24 & 255u))], 8) ^ array[0]);
            num6    = (AesEngine.T0[(int)((UIntPtr)(num2 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num3 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num >> 24 & 255u))], 8) ^ array[1]);
            num7    = (AesEngine.T0[(int)((UIntPtr)(num3 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num4 >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num2 >> 24 & 255u))], 8) ^ array[2]);
            num4    = (AesEngine.T0[(int)((UIntPtr)(num4 & 255u))] ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num >> 8 & 255u))], 24) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num2 >> 16 & 255u))], 16) ^ AesEngine.Shift(AesEngine.T0[(int)((UIntPtr)(num3 >> 24 & 255u))], 8) ^ array[3]);
            array   = KW[i];
            this.C0 = (uint)((int)AesEngine.S[(int)((UIntPtr)(num5 & 255u))] ^ (int)AesEngine.S[(int)((UIntPtr)(num6 >> 8 & 255u))] << 8 ^ (int)AesEngine.S[(int)((UIntPtr)(num7 >> 16 & 255u))] << 16 ^ (int)AesEngine.S[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24 ^ (int)array[0]);
            this.C1 = (uint)((int)AesEngine.S[(int)((UIntPtr)(num6 & 255u))] ^ (int)AesEngine.S[(int)((UIntPtr)(num7 >> 8 & 255u))] << 8 ^ (int)AesEngine.S[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesEngine.S[(int)((UIntPtr)(num5 >> 24 & 255u))] << 24 ^ (int)array[1]);
            this.C2 = (uint)((int)AesEngine.S[(int)((UIntPtr)(num7 & 255u))] ^ (int)AesEngine.S[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesEngine.S[(int)((UIntPtr)(num5 >> 16 & 255u))] << 16 ^ (int)AesEngine.S[(int)((UIntPtr)(num6 >> 24 & 255u))] << 24 ^ (int)array[2]);
            this.C3 = (uint)((int)AesEngine.S[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesEngine.S[(int)((UIntPtr)(num5 >> 8 & 255u))] << 8 ^ (int)AesEngine.S[(int)((UIntPtr)(num6 >> 16 & 255u))] << 16 ^ (int)AesEngine.S[(int)((UIntPtr)(num7 >> 24 & 255u))] << 24 ^ (int)array[3]);
        }
Exemple #6
0
        // Token: 0x06000124 RID: 292 RVA: 0x000093FC File Offset: 0x000075FC
        private uint[][] GenerateWorkingKey(byte[] key, bool forEncryption)
        {
            int num = key.Length;

            if (num < 16 || num > 32 || (num & 7) != 0)
            {
                throw new ArgumentException("Key length not 128/192/256 bits.");
            }
            int num2 = num >> 2;

            this.ROUNDS = num2 + 6;
            uint[][] array = new uint[this.ROUNDS + 1][];
            for (int i = 0; i <= this.ROUNDS; i++)
            {
                array[i] = new uint[4];
            }
            switch (num2)
            {
            case 4:
            {
                uint num3 = Pack.LE_To_UInt32(key, 0);
                array[0][0] = num3;
                uint num4 = Pack.LE_To_UInt32(key, 4);
                array[0][1] = num4;
                uint num5 = Pack.LE_To_UInt32(key, 8);
                array[0][2] = num5;
                uint num6 = Pack.LE_To_UInt32(key, 12);
                array[0][3] = num6;
                for (int j = 1; j <= 10; j++)
                {
                    uint num7 = AesEngine.SubWord(AesEngine.Shift(num6, 8)) ^ (uint)AesEngine.rcon[j - 1];
                    num3       ^= num7;
                    array[j][0] = num3;
                    num4       ^= num3;
                    array[j][1] = num4;
                    num5       ^= num4;
                    array[j][2] = num5;
                    num6       ^= num5;
                    array[j][3] = num6;
                }
                goto IL_4EC;
            }

            case 6:
            {
                uint num8 = Pack.LE_To_UInt32(key, 0);
                array[0][0] = num8;
                uint num9 = Pack.LE_To_UInt32(key, 4);
                array[0][1] = num9;
                uint num10 = Pack.LE_To_UInt32(key, 8);
                array[0][2] = num10;
                uint num11 = Pack.LE_To_UInt32(key, 12);
                array[0][3] = num11;
                uint num12 = Pack.LE_To_UInt32(key, 16);
                array[1][0] = num12;
                uint num13 = Pack.LE_To_UInt32(key, 20);
                array[1][1] = num13;
                uint num14 = 1U;
                uint num15 = AesEngine.SubWord(AesEngine.Shift(num13, 8)) ^ num14;
                num14     <<= 1;
                num8       ^= num15;
                array[1][2] = num8;
                num9       ^= num8;
                array[1][3] = num9;
                num10      ^= num9;
                array[2][0] = num10;
                num11      ^= num10;
                array[2][1] = num11;
                num12      ^= num11;
                array[2][2] = num12;
                num13      ^= num12;
                array[2][3] = num13;
                for (int k = 3; k < 12; k += 3)
                {
                    num15           = (AesEngine.SubWord(AesEngine.Shift(num13, 8)) ^ num14);
                    num14         <<= 1;
                    num8           ^= num15;
                    array[k][0]     = num8;
                    num9           ^= num8;
                    array[k][1]     = num9;
                    num10          ^= num9;
                    array[k][2]     = num10;
                    num11          ^= num10;
                    array[k][3]     = num11;
                    num12          ^= num11;
                    array[k + 1][0] = num12;
                    num13          ^= num12;
                    array[k + 1][1] = num13;
                    num15           = (AesEngine.SubWord(AesEngine.Shift(num13, 8)) ^ num14);
                    num14         <<= 1;
                    num8           ^= num15;
                    array[k + 1][2] = num8;
                    num9           ^= num8;
                    array[k + 1][3] = num9;
                    num10          ^= num9;
                    array[k + 2][0] = num10;
                    num11          ^= num10;
                    array[k + 2][1] = num11;
                    num12          ^= num11;
                    array[k + 2][2] = num12;
                    num13          ^= num12;
                    array[k + 2][3] = num13;
                }
                num15        = (AesEngine.SubWord(AesEngine.Shift(num13, 8)) ^ num14);
                num8        ^= num15;
                array[12][0] = num8;
                num9        ^= num8;
                array[12][1] = num9;
                num10       ^= num9;
                array[12][2] = num10;
                num11       ^= num10;
                array[12][3] = num11;
                goto IL_4EC;
            }

            case 8:
            {
                uint num16 = Pack.LE_To_UInt32(key, 0);
                array[0][0] = num16;
                uint num17 = Pack.LE_To_UInt32(key, 4);
                array[0][1] = num17;
                uint num18 = Pack.LE_To_UInt32(key, 8);
                array[0][2] = num18;
                uint num19 = Pack.LE_To_UInt32(key, 12);
                array[0][3] = num19;
                uint num20 = Pack.LE_To_UInt32(key, 16);
                array[1][0] = num20;
                uint num21 = Pack.LE_To_UInt32(key, 20);
                array[1][1] = num21;
                uint num22 = Pack.LE_To_UInt32(key, 24);
                array[1][2] = num22;
                uint num23 = Pack.LE_To_UInt32(key, 28);
                array[1][3] = num23;
                uint num24 = 1U;
                uint num25;
                for (int l = 2; l < 14; l += 2)
                {
                    num25           = (AesEngine.SubWord(AesEngine.Shift(num23, 8)) ^ num24);
                    num24         <<= 1;
                    num16          ^= num25;
                    array[l][0]     = num16;
                    num17          ^= num16;
                    array[l][1]     = num17;
                    num18          ^= num17;
                    array[l][2]     = num18;
                    num19          ^= num18;
                    array[l][3]     = num19;
                    num25           = AesEngine.SubWord(num19);
                    num20          ^= num25;
                    array[l + 1][0] = num20;
                    num21          ^= num20;
                    array[l + 1][1] = num21;
                    num22          ^= num21;
                    array[l + 1][2] = num22;
                    num23          ^= num22;
                    array[l + 1][3] = num23;
                }
                num25        = (AesEngine.SubWord(AesEngine.Shift(num23, 8)) ^ num24);
                num16       ^= num25;
                array[14][0] = num16;
                num17       ^= num16;
                array[14][1] = num17;
                num18       ^= num17;
                array[14][2] = num18;
                num19       ^= num18;
                array[14][3] = num19;
                goto IL_4EC;
            }
            }
            throw new InvalidOperationException("Should never get here");
IL_4EC:
            if (!forEncryption)
            {
                for (int m = 1; m < this.ROUNDS; m++)
                {
                    uint[] array2 = array[m];
                    for (int n = 0; n < 4; n++)
                    {
                        array2[n] = AesEngine.Inv_Mcol(array2[n]);
                    }
                }
            }
            return(array);
        }