/// <summary>
        /// Decrypts a stream with the given configuration.
        /// Not for networking.
        /// </summary>
        /// <param name="input"></param>
        /// <param name="output"></param>
        /// <param name="pass"></param>
        /// <param name="initial"></param>
        /// <param name="rounds"></param>
        /// <param name="leftoff"></param>
        /// <param name="expansion"></param>
        /// <param name="additionalKey"></param>
        /// <param name="callback"></param>
        /// <param name="adaptor">Adaptor for PRNG</param>
        public static void Decrypt(Stream input, Stream output, string pass, int initial, int rounds, int leftoff, int expansion, string additionalKey, Callback callback, BasylPseudoAdaptor adaptor)
        {
            BinaryWriter writer = new BinaryWriter(output);

            byte[] hash = new byte[32];
            byte[] o    = new byte[4];
            byte[] d    = new byte[4];
            input.Read(hash, 0, 32);
            input.Read(o, 0, 4);
            input.Read(d, 0, 4);
            BasylReader reader = new BasylReader(input, new BasylKeyGenerator(pass, initial, rounds, leftoff, expansion, additionalKey, hash, d, o, true, adaptor));

            //Speeds up decryption by doing the decryption in chunks.
            int speed = MAX_SPEED;

            while (speed > MIN_SPEED)
            {
                //Decrypt Entire File in Chunks
                while (reader.GetStream().Position + speed < reader.GetStream().Length)
                {
                    writer.Write(reader.ReadBytes(speed));
                    if (callback != null)
                    {
                        callback((double)reader.GetStream().Position / reader.GetStream().Length);
                    }
                }
                speed >>= 1;
            }


            //Decrypt Entire File
            while (reader.GetStream().Position < reader.GetStream().Length)
            {
                writer.Write(reader.ReadByte());
                if (callback != null)
                {
                    callback((double)reader.GetStream().Position / reader.GetStream().Length);
                }
            }


            writer.Close();
            reader.Close();
            reader.Dispose();
            writer.Dispose();
        }