private static uint Inv_Mcol(uint x) { uint num = AesLightEngine.FFmulX(x); uint num2 = AesLightEngine.FFmulX(num); uint num3 = AesLightEngine.FFmulX(num2); uint num4 = x ^ num3; return(num ^ num2 ^ num3 ^ AesLightEngine.Shift(num ^ num4, 8) ^ AesLightEngine.Shift(num2 ^ num4, 16) ^ AesLightEngine.Shift(num4, 24)); }
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); }
private static uint Mcol(uint x) { uint num = AesLightEngine.FFmulX(x); return(num ^ AesLightEngine.Shift(x ^ num, 8) ^ AesLightEngine.Shift(x, 16) ^ AesLightEngine.Shift(x, 24)); }