static void Main(string[] args) { switch (args.Length) { case 3: { var stopwatch = new Stopwatch(); stopwatch.Start(); var key = Encoding.ASCII.GetBytes(args[0]); using (var srcFile = new FileStream(args[1], FileMode.Open)) { using (var destFile = new FileStream(args[2], FileMode.Create)) { Console.WriteLine("Encoding..."); var rc4 = new RC4Stream(key, srcFile); rc4.CopyTo(destFile); var elapsed = stopwatch.Elapsed; var speed = (srcFile.Length * 1f / (1 << 20)) / (elapsed.TotalMilliseconds / 1000); Console.WriteLine($"Completed in {elapsed.TotalSeconds:F1} seconds at {speed:F1} MB/s"); } } } break; case 1: { var key = Encoding.ASCII.GetBytes(args[0]); Console.WriteLine("Enter input text:"); var text = Console.ReadLine(); var input = Encoding.ASCII.GetBytes(text); var rc4 = new RC4(key); var output = rc4.TransformFinalBlock(input, 0, input.Length); Console.WriteLine("Output bytes:"); foreach (byte b in output) { Console.Write($"{b:x2} "); } Console.WriteLine(); } break; default: Console.WriteLine($"Usage: RC4App key [source] [destination]"); break; } }
public void EncryptToStreamTest() { // arrange var key = "Key"; var srcFile = new FileStream("Data/test1.txt", FileMode.Open); var destStream = new MemoryStream(); // action var rc4 = new RC4Stream(Encoding.ASCII.GetBytes(key), srcFile); rc4.CopyTo(destStream, 1); // assert var cipherText = new byte[destStream.Length]; destStream.Seek(0, SeekOrigin.Begin); destStream.Read(cipherText, 0, cipherText.Length); Assert.AreEqual(new byte[] { 0xBB, 0xF3, 0x16, 0xE8, 0xD9, 0x40, 0xAF, 0x0A, 0xD3 }, cipherText); srcFile.Close(); }
public void DecryptToStreamTest() { // arrange var key = "Key"; var srcStream = new MemoryStream(); var destStream = new MemoryStream(); srcStream.Write(new byte[] { 0xBB, 0xF3, 0x16, 0xE8, 0xD9, 0x40, 0xAF, 0x0A, 0xD3 }); srcStream.Seek(0, SeekOrigin.Begin); // action var rc4 = new RC4Stream(Encoding.ASCII.GetBytes(key), srcStream); rc4.CopyTo(destStream, 1); // assert destStream.Seek(0, SeekOrigin.Begin); var reader = new StreamReader(destStream); var plainText = reader.ReadToEnd(); Assert.AreEqual("Plaintext", plainText); }