145 lines
3.5 KiB
C#
145 lines
3.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace SubstitutionCipherProject
|
|
{
|
|
class SubstitutionCipher
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
doEncDec("e:\\source.txt", "enc.txt", true);
|
|
doEncDec("enc.txt", "dec.txt", false);
|
|
Console.WriteLine("Done");
|
|
Console.ReadKey();
|
|
}
|
|
static void doEncDec(String source, String target, bool IsEncrypt)
|
|
{
|
|
ITransform trans;
|
|
|
|
if (IsEncrypt)
|
|
trans = new Encrypt();
|
|
else
|
|
trans = new Decrypt();
|
|
|
|
FileInfo sfi = new FileInfo(source);
|
|
FileStream sstream = sfi.OpenRead();
|
|
StreamReader sr = new StreamReader(sstream);
|
|
|
|
FileInfo tfi = new FileInfo(target);
|
|
FileStream tstream = tfi.OpenWrite();
|
|
TransformWriter tw = new TransformWriter(tstream, trans);
|
|
StreamWriter sw = new StreamWriter(tw);
|
|
|
|
String line;
|
|
while ((line = sr.ReadLine()) != null)
|
|
sw.WriteLine(line);
|
|
sw.Close();
|
|
}
|
|
}
|
|
public interface ITransform
|
|
{
|
|
byte transform(byte ch);
|
|
}
|
|
public class Encrypt : ITransform
|
|
{
|
|
const String str = "xyfagchbimpourvnqsdewtkjzl";
|
|
byte ITransform.transform(byte ch)
|
|
{
|
|
if (char.IsLower((char)ch))
|
|
ch = (byte)str[ch - (byte)'a'];
|
|
return ch;
|
|
}
|
|
}
|
|
class Decrypt : ITransform
|
|
{
|
|
const String str = "xyfagchbimpourvnqsdewtkjzl";
|
|
byte ITransform.transform(byte ch)
|
|
{
|
|
if (char.IsLower((char)ch))
|
|
ch = (byte)(str.IndexOf((char)ch) + 'a');
|
|
return ch;
|
|
}
|
|
}
|
|
class TransformWriter : Stream, IDisposable
|
|
{
|
|
private Stream outs;
|
|
private ITransform trans;
|
|
|
|
public TransformWriter(Stream s, ITransform t)
|
|
{
|
|
this.outs = s;
|
|
this.trans = t;
|
|
}
|
|
|
|
public override bool CanRead
|
|
{
|
|
get { return false; }
|
|
}
|
|
|
|
public override bool CanSeek
|
|
{
|
|
get { return false; }
|
|
}
|
|
|
|
public override bool CanWrite
|
|
{
|
|
get { return true; }
|
|
}
|
|
public override void Flush()
|
|
{
|
|
outs.Flush();
|
|
}
|
|
|
|
public override long Length
|
|
{
|
|
get { return outs.Length; }
|
|
}
|
|
public override long Position
|
|
{
|
|
get
|
|
{
|
|
return outs.Position;
|
|
}
|
|
set
|
|
{
|
|
outs.Position = value;
|
|
}
|
|
}
|
|
public override long Seek(long offset, SeekOrigin origin)
|
|
{
|
|
return outs.Seek(offset, origin);
|
|
}
|
|
|
|
public override void SetLength(long value)
|
|
{
|
|
outs.SetLength(value);
|
|
}
|
|
|
|
public override void Write(byte[] buf, int off, int len)
|
|
{
|
|
for (int i = off; i < off + len; i++)
|
|
buf[i] = trans.transform(buf[i]);
|
|
outs.Write(buf, off, len);
|
|
}
|
|
|
|
void IDisposable.Dispose()
|
|
{
|
|
outs.Dispose();
|
|
}
|
|
|
|
public override void Close()
|
|
{
|
|
outs.Close();
|
|
}
|
|
|
|
public override int Read(byte[] cbuf, int off, int count)
|
|
{
|
|
return outs.Read(cbuf, off, count);
|
|
}
|
|
}
|
|
}
|