using System;
using System.IO;
using System.Security.AccessControl;
namespace P11_4 
{ 
    class CryptStreamSample 
    { 
        static void Main() 
        { 
            //üдļ 
            FileStream fs = new CzCryptStream("EncyptTest.txt",FileMode.Create, "Hello"); 
            StreamWriter sw = new StreamWriter(fs); 
            sw.WriteLine("");
            sw.WriteLine("    һļܲԳ"); 
            sw.Close(); 
            //ͨȡļ 
            fs = new FileStream("EncyptLetter.txt", FileMode.Open); 
            StreamReader sr = new StreamReader(fs); 
            Console.WriteLine("ļݣ"); 
            while (!sr.EndOfStream) 
                Console.WriteLine(sr.ReadLine()); 
            sr.Close(); 
            //üȡļ 
            fs = new CzCryptStream("EncyptTest.txt", FileMode.Open, "Hello"); 
            sr = new StreamReader(fs); 
            Console.WriteLine("\nļݣ"); 
            while (!sr.EndOfStream) 
                Console.WriteLine(sr.ReadLine()); 
            sr.Close(); 
            fs.Close();
            Console.ReadLine();
        } 
    } 
    public class CzCryptStream : FileStream 
    { 
 
	private byte[] m_key; 
	public CzCryptStream(string sPath, FileMode fMode, string sKey):base(sPath, fMode) 
        { 
            m_key = new byte[sKey.Length]; 
            for (int i = 0; i < sKey.Length; i++) 
                m_key[i] = (byte)sKey[i]; 
        } 
        public override int ReadByte() 
        { 
            return base.ReadByte() ^ m_key[this.Position % m_key.Length]; 
        }
        public override void WriteByte(byte value)
        {
            value ^= m_key[this.Position % m_key.Length];
            base.WriteByte(value);
        }
       public override int Read(byte[] buffer, int offset, int count)
        {
            int iLen = base.Read(buffer, offset, count);
            for (int i = 0; i < iLen; i++)
            {
                buffer[i] ^= m_key[(offset + i) % m_key.Length];
            }
            return iLen;
        }
        public override void Write(byte[] buffer, int offset, int count)
        {
            for (int i = 0; i < buffer.Length; i++)
            {
                buffer[i] ^= m_key[(offset + i) % m_key.Length];
            }
            base.Write(buffer, offset, count);
        }
    }
}
