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 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]); }
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)); }
private BufferedBlockCipher CreateScryptoEngine() { IBlockCipher engine; switch (_MSec.Algorithm) { case ESec.SCRYPTO_AES: engine = new AesEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_AESFAST: engine = new AesFastEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_AESLIGHT: engine = new AesLightEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_BLOWFISH: engine = new BlowfishEngine(); _MSec.KeySize = 56; _MSec.IVSize = 0; break; case ESec.SCRYPTO_CAMELLIA: engine = new CamelliaEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_CAMELLIALIGHT: engine = new CamelliaLightEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_CAST5: engine = new Cast5Engine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; case ESec.SCRYPTO_CAST6: engine = new Cast6Engine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_DES: engine = new DesEngine(); _MSec.KeySize = 8; _MSec.IVSize = 0; break; case ESec.SCRYPTO_DESEDE: engine = new DesEdeEngine(); _MSec.KeySize = 24; _MSec.IVSize = 0; break; case ESec.SCRYPTO_GOST28147: engine = new Gost28147Engine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_NOEKEON: engine = new NoekeonEngine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; case ESec.SCRYPTO_NULL: engine = new NullEngine(); _MSec.KeySize = 32; _MSec.IVSize = 16; break; case ESec.SCRYPTO_RC2: engine = new RC2Engine(); _MSec.KeySize = 128; _MSec.IVSize = 0; break; case ESec.SCRYPTO_RC532: engine = new RC532Engine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; case ESec.SCRYPTO_RC564: engine = new RC564Engine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; case ESec.SCRYPTO_RC6: engine = new RC6Engine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_RIJNDAEL: engine = new RijndaelEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_SEED: engine = new SeedEngine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; case ESec.SCRYPTO_SERPENT: engine = new SerpentEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_SKIPJACK: engine = new SkipjackEngine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; case ESec.SCRYPTO_TEA: engine = new TeaEngine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; case ESec.SCRYPTO_TWOFISH: engine = new TwofishEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; case ESec.SCRYPTO_XTEA: engine = new XteaEngine(); _MSec.KeySize = 16; _MSec.IVSize = 0; break; default: engine = new AesEngine(); _MSec.KeySize = 32; _MSec.IVSize = 0; break; } switch (_MSec.Mode) { case ESec.MODE_CBC: engine = new CbcBlockCipher(engine); break; case ESec.MODE_CFB: engine = new CfbBlockCipher(engine, 8); break; case ESec.MODE_GOFB: engine = new GOfbBlockCipher(engine); break; case ESec.MODE_OFB: engine = new OfbBlockCipher(engine, 8); break; case ESec.MODE_OPENPGPCFB: engine = new OpenPgpCfbBlockCipher(engine); break; case ESec.MODE_SIC: engine = new SicBlockCipher(engine); break; default: engine = new CbcBlockCipher(engine); break; } IBlockCipherPadding padding = null; switch (_MSec.Padding) { case ESec.PADDING_ISO10126d2: padding = new ISO10126d2Padding(); break; case ESec.PADDING_ISO7816d4: padding = new ISO7816d4Padding(); break; case ESec.PADDING_PKCS7: padding = new Pkcs7Padding(); break; case ESec.PADDING_TBC: padding = new TbcPadding(); break; case ESec.PADDING_X923: padding = new X923Padding(); break; case ESec.PADDING_ZEROBYTE: padding = new ZeroBytePadding(); break; default: padding = new Pkcs7Padding(); break; } return new PaddedBufferedBlockCipher(engine, padding); }