static void Main(string[] args) { TcpListener tcpl = null; TcpClient tcpc = null; NetworkStream stream = null; TripleDESCryptoServiceProvider crypt3des = null; SymmetricsSI symmetrics = null; RSACryptoServiceProvider rsaClient = null; RSACryptoServiceProvider rsaServer = null; try { Console.WriteLine("SERVER\n"); tcpl = new TcpListener(IPAddress.Any, 9999); tcpl.Start(); tcpc = tcpl.AcceptTcpClient(); stream = tcpc.GetStream(); ProtocolSI protocol = new ProtocolSI(); ProtocolSICmdType command; byte[] packet = protocol.Make(ProtocolSICmdType.ACK); crypt3des = new TripleDESCryptoServiceProvider(); symmetrics = new SymmetricsSI(crypt3des); rsaClient = new RSACryptoServiceProvider(); rsaServer = new RSACryptoServiceProvider(); string privateAndPublicKeyFilename = "serverpvpbkey.txt"; if (File.Exists(privateAndPublicKeyFilename)) rsaServer.FromXmlString(File.ReadAllText(privateAndPublicKeyFilename)); else File.WriteAllText(privateAndPublicKeyFilename, rsaServer.ToXmlString(true)); Console.WriteLine("waiting for client public key"); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); rsaClient.FromXmlString(protocol.GetStringFromData()); Console.WriteLine("ok"); Console.WriteLine("CLIENT PUBLIC KEY: " + rsaServer.ToXmlString(false)); Console.WriteLine("sending for server public key"); packet = protocol.Make(ProtocolSICmdType.PUBLIC_KEY, rsaServer.ToXmlString(false)); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); Console.WriteLine("ok"); Console.WriteLine("sending for 3des key"); packet = protocol.Make(ProtocolSICmdType.SECRET_KEY, rsaServer.Encrypt(crypt3des.Key, false)); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); Console.WriteLine("ok"); Console.WriteLine("sending for 3des iv"); packet = protocol.Make(ProtocolSICmdType.IV, rsaServer.Encrypt(crypt3des.IV, false)); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); Console.WriteLine("ok"); Console.WriteLine("sending for 3des padding"); packet = protocol.Make(ProtocolSICmdType.IV, rsaServer.Encrypt(BitConverter.GetBytes((int)crypt3des.Padding), false)); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); Console.WriteLine("ok"); Console.WriteLine("sending for 3des mode"); packet = protocol.Make(ProtocolSICmdType.MODE, rsaServer.Encrypt(BitConverter.GetBytes((int)crypt3des.Mode), false)); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); Console.WriteLine("ok"); } catch (Exception e) { Console.WriteLine(e.Message); throw; } finally { Console.WriteLine("disconnected"); if (stream != null) stream.Dispose(); if (tcpc != null) tcpc.Close(); if (tcpl != null) tcpl.Stop(); } }
static void Main(string[] args) { Console.WriteLine("CLIENT\n"); TcpClient tcpc = null; NetworkStream stream = null; TripleDESCryptoServiceProvider crypt3des = null; SymmetricsSI symmetrics = null; RSACryptoServiceProvider rsaClient = null; RSACryptoServiceProvider rsaServer = null; try { tcpc = new TcpClient(); tcpc.Connect("", 9999); stream = tcpc.GetStream(); ProtocolSI protocol = new ProtocolSI(); byte[] packet; crypt3des = new TripleDESCryptoServiceProvider(); symmetrics = new SymmetricsSI(crypt3des); rsaClient = new RSACryptoServiceProvider(); string privateAndPublicKeyFilename = "clientpvpbkey.txt"; rsaServer = new RSACryptoServiceProvider(); if (File.Exists(privateAndPublicKeyFilename)) rsaClient.FromXmlString(File.ReadAllText(privateAndPublicKeyFilename)); else File.WriteAllText(privateAndPublicKeyFilename, rsaClient.ToXmlString(true)); var ack = protocol.Make(ProtocolSICmdType.ACK); // Send key Console.WriteLine("sending for client public key"); packet = protocol.Make(ProtocolSICmdType.PUBLIC_KEY, rsaClient.ToXmlString(false)); stream.Write(packet, 0, packet.Length); Console.WriteLine("ok"); Console.WriteLine("waiting for server public key"); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); stream.Write(ack, 0, ack.Length); rsaServer.FromXmlString(protocol.GetStringFromData()); Console.WriteLine("ok"); Console.WriteLine("SERVER PUBLIC KEY: " + rsaServer.ToXmlString(false)); Console.WriteLine("waiting for 3des key"); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); stream.Write(ack, 0, ack.Length); crypt3des.Key = rsaServer.Decrypt(protocol.GetData(), false); Console.WriteLine("ok"); Console.WriteLine("3DES KEY: " + crypt3des.Key.ToString()); Console.WriteLine("waiting for 3des iv"); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); stream.Write(ack, 0, ack.Length); crypt3des.IV = rsaServer.Decrypt(protocol.GetData(), false); Console.WriteLine("ok"); Console.WriteLine("3DES IV: " + crypt3des.IV.ToString()); Console.WriteLine("waiting for 3des padding"); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); stream.Write(ack, 0, ack.Length); crypt3des.Padding = (PaddingMode)BitConverter.ToInt32(rsaServer.Decrypt(protocol.GetData(), false), 0); Console.WriteLine("ok"); Console.WriteLine("3DES PADDING: " + crypt3des.Padding.ToString()); Console.WriteLine("waiting for 3des mode"); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); stream.Write(ack, 0, ack.Length); crypt3des.Mode = (CipherMode)BitConverter.ToInt32(rsaServer.Decrypt(protocol.GetData(), false), 0); Console.WriteLine("ok"); Console.WriteLine("3DES MODE: " + crypt3des.Mode.ToString()); } catch (Exception e) { Console.WriteLine(e.Message); throw; } finally { Console.WriteLine("disconnected"); if (stream != null) stream.Dispose(); if (tcpc != null) tcpc.Close(); if (crypt3des != null) crypt3des.Dispose(); if (symmetrics != null) crypt3des.Dispose(); if (rsaClient != null) rsaClient.Dispose(); if (rsaServer != null) rsaServer.Dispose(); } }
static void Main(string[] args) { TcpClient tcpc = null; NetworkStream stream = null; TripleDESCryptoServiceProvider crypto = null; SymmetricsSI symmetrics = null; try { Console.Write("A ligar ao servidor... "); tcpc = new TcpClient(); tcpc.Connect("", 9999); Console.WriteLine("ok"); stream = tcpc.GetStream(); ProtocolSI protocol = new ProtocolSI(); byte[] packet; crypto = new TripleDESCryptoServiceProvider(); symmetrics = new SymmetricsSI(crypto); // Send key packet = protocol.Make(ProtocolSICmdType.PADDING, (int)crypto.Padding); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); packet = protocol.Make(ProtocolSICmdType.IV, crypto.IV); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); packet = protocol.Make(ProtocolSICmdType.MODE, (int)crypto.Mode); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); packet = protocol.Make(ProtocolSICmdType.SECRET_KEY, crypto.Key); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); packet = protocol.Make(ProtocolSICmdType.EOF); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); var message = symmetrics.Encrypt(Encoding.UTF8.GetBytes("HelloWorld")); packet = protocol.Make(ProtocolSICmdType.SYM_CIPHER_DATA, message); stream.Write(packet, 0, packet.Length); stream.Read(protocol.Buffer, 0, protocol.Buffer.Length); if (protocol.GetCmdType() != ProtocolSICmdType.ACK) throw new Exception("Server could not decrypt"); } catch (Exception e) { Console.WriteLine(e.Message); throw; } finally { Console.WriteLine("disconnected"); if (stream != null) stream.Dispose(); if (tcpc != null) tcpc.Close(); if (crypto != null) crypto.Dispose(); if (symmetrics != null) crypto.Dispose(); } }