Inv_Mcol() 개인적인 정적인 메소드

private static Inv_Mcol ( uint x ) : uint
x uint
리턴 uint
예제 #1
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 = (AesLightEngine.SubWord(AesLightEngine.Shift(num4, 8)) ^ (uint)AesLightEngine.rcon[k / num - 1]);
                }
                else if (num > 6 && k % num == 4)
                {
                    num4 = AesLightEngine.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] = AesLightEngine.Inv_Mcol(array2[m]);
                    }
                }
            }
            return(array);
        }
예제 #2
0
        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  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 24 & 255u))] << 24)) ^ array[0]);
                num6  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num2 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 24 & 255u))] << 24)) ^ array[1]);
                num7  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num3 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24)) ^ array[2]);
                num4  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 24 & 255u))] << 24)) ^ array[3]);
                array = KW[i--];
                num   = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num5 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 24 & 255u))] << 24)) ^ array[0]);
                num2  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num6 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 24 & 255u))] << 24)) ^ array[1]);
                num3  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num7 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24)) ^ array[2]);
                num4  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 24 & 255u))] << 24)) ^ array[3]);
            }
            array   = KW[1];
            num5    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 24 & 255u))] << 24)) ^ array[0]);
            num6    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num2 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 24 & 255u))] << 24)) ^ array[1]);
            num7    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num3 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24)) ^ array[2]);
            num4    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 24 & 255u))] << 24)) ^ array[3]);
            array   = KW[0];
            this.C0 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num5 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 24 & 255u))] << 24 ^ (int)array[0]);
            this.C1 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num6 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 24 & 255u))] << 24 ^ (int)array[1]);
            this.C2 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num7 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24 ^ (int)array[2]);
            this.C3 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 24 & 255u))] << 24 ^ (int)array[3]);
        }