public byte[] Decrypt(byte[] input) { byte[] output = new byte[input.Length]; byte[] key = (byte[])(NormalKeys[Slot].Clone()); byte[] ctr_iv_nonce = new byte[0x10]; CTR_IV_NONCE.CopyTo(ctr_iv_nonce, 0); switch (Mode) { case AesMode.NotSupported: throw new NotSupportedException(); case AesMode.CBC: using (var _aes = CreateAes(key, ctr_iv_nonce, CipherMode.CBC, PaddingMode.None)) { _aes.CreateDecryptor(_aes.Key, _aes.IV).TransformBlock(input, 0, input.Length, output, 0); } break; case AesMode.CTR: using (var _aes = new AesCtr(ctr_iv_nonce)) { _aes.CreateDecryptor(key).TransformBlock(input, 0, input.Length, output, 0); } break; case AesMode.ECB: using (var _aes = CreateAes(key, ctr_iv_nonce, CipherMode.ECB, PaddingMode.None)) { _aes.CreateDecryptor(_aes.Key, _aes.IV).TransformBlock(input, 0, input.Length, output, 0); } break; } return(output); }
public void Decrypt(Stream inStream, Stream outStream, long count) { byte[] key = (byte[])(NormalKeys[Slot].Clone()); byte[] ctr_iv_nonce = new byte[0x10]; CTR_IV_NONCE.CopyTo(ctr_iv_nonce, 0); switch (Mode) { case AesMode.NotSupported: throw new NotSupportedException(); case AesMode.CBC: using (var _aes = CreateAes(key, ctr_iv_nonce, CipherMode.CBC, PaddingMode.None)) { using (var decryptor = _aes.CreateDecryptor(_aes.Key, _aes.IV)) { byte[] inBuf; byte[] outBuf; while (count > 0) { inBuf = new byte[count > 0x100000 ? 0x100000 : count]; outBuf = new byte[count > 0x100000 ? 0x100000 : count]; inStream.Read(inBuf, 0, inBuf.Length); decryptor.TransformBlock(inBuf, 0, inBuf.Length, outBuf, 0); outStream.Write(outBuf, 0, outBuf.Length); count -= inBuf.Length; } } } break; case AesMode.CTR: using (var _aes = new AesCtr(ctr_iv_nonce)) { using (var decryptor = _aes.CreateDecryptor(key)) { byte[] inBuf; byte[] outBuf; while (count > 0) { inBuf = new byte[count > 0x100000 ? 0x100000 : count]; outBuf = new byte[count > 0x100000 ? 0x100000 : count]; inStream.Read(inBuf, 0, inBuf.Length); decryptor.TransformBlock(inBuf, 0, inBuf.Length, outBuf, 0); outStream.Write(outBuf, 0, outBuf.Length); count -= inBuf.Length; } } } break; case AesMode.ECB: using (var _aes = CreateAes(key, ctr_iv_nonce, CipherMode.ECB, PaddingMode.None)) { using (var decryptor = _aes.CreateDecryptor(key, _aes.IV)) { byte[] inBuf; byte[] outBuf; while (count > 0) { inBuf = new byte[count > 0x100000 ? 0x100000 : count]; outBuf = new byte[count > 0x100000 ? 0x100000 : count]; inStream.Read(inBuf, 0, inBuf.Length); decryptor.TransformBlock(inBuf, 0, inBuf.Length, outBuf, 0); outStream.Write(outBuf, 0, outBuf.Length); count -= inBuf.Length; } } } break; } }