// (c) 2006 Richard Grimes // www.grimes.demon.co.uk using System; using System.Security.Cryptography; using System.Net; using System.Net.Sockets; using System.Text; class Alice { static void Main(string[] args) { if (args.Length == 0) return; TcpClient client = new TcpClient(); client.Connect(IPAddress.Loopback, 5000); NetworkStream stm = client.GetStream(); if (args[0].ToLower() == "quit") { byte[] quit = Encoding.ASCII.GetBytes(args[0]); stm.Write(quit, 0, quit.Length); client.Close(); return; } byte[] buf = Encoding.ASCII.GetBytes("KEY"); stm.Write(buf, 0, buf.Length); byte[] readBuf = new byte[client.ReceiveBufferSize]; int read = stm.Read(readBuf, 0, readBuf.Length); string reply = Encoding.ASCII.GetString(readBuf, 0, read); if (reply.ToLower() == "ack") { CspParameters csp = new CspParameters(1, null, "Bob"); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); RSACryptoServiceProvider rsaBobPubKey = new RSACryptoServiceProvider(); rsaBobPubKey.ImportParameters(rsa.ExportParameters(false)); RSAPKCS1KeyExchangeFormatter exch = new RSAPKCS1KeyExchangeFormatter(); exch.SetKey(rsaBobPubKey); Rijndael session = Rijndael.Create(); byte[] key = exch.CreateKeyExchange(session.Key); stm.Write(key, 0, key.Length); read = stm.Read(readBuf, 0, readBuf.Length); reply = Encoding.ASCII.GetString(readBuf, 0, read); if (reply.ToLower() == "ack") { stm.Write(session.IV, 0, session.IV.Length); read = stm.Read(readBuf, 0, readBuf.Length); reply = Encoding.ASCII.GetString(readBuf, 0, read); if (reply.ToLower() == "ack") { CryptoStream cryptostm = new CryptoStream(stm, session.CreateEncryptor(), CryptoStreamMode.Write); byte[] data = Encoding.ASCII.GetBytes(args[0]); cryptostm.Write(data, 0, data.Length); cryptostm.FlushFinalBlock(); cryptostm.Clear(); } } } client.Close(); } }