المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : sockets + Cryptography



C# Programming
05-11-2013, 10:42 AM
Hi, I want to realise a Cleint/Server chat app that respects this:

1- Server connects to client;
2- server send "Hello" to client;
3- cleint responses with "Hello, ok";
4- server generates RSA Key and send public key to cleint;
5- client select a random algorithm from DES, AES(128, 192, 256) and sends it to the server;
6- server sends "GENERATE FIRST KEY" to client;
7- cleint generate a key with a size that dependse on the algorithm choosen in step 5, and encrypt it using the public key;
8- server decrypts the key;

Now the server and client can communicate using the shared key, and to make it more secure, after 5 min server send "NEXT KEY", to generate another key


Untill now I just can chat between client and server without encrypt messages, and this is my code


Server:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading; namespace Server___Tutorial{ public partial class Form1 : Form { int i; TcpListener server = new TcpListener(IPAddress.Any, 1980); // Creates a TCP Listener To Listen to Any IPAddress trying to connect to the program with port 1980 NetworkStream stream; //Creats a NetworkStream (used for sending and receiving data) TcpClient client; // Creates a TCP Client byte[] datalength = new byte[4]; // creates a new byte with length 4 ( used for receivng data's lenght) public Form1() { InitializeComponent(); } public void ServerReceive() { stream = client.GetStream(); //Gets The Stream of The Connection new Thread(() => // Thread (like Timer) { while ((i = stream.Read(datalength, 0, 4)) != 0)//Keeps Trying to Receive the Size of the Message or Data { // how to make a byte E.X byte[] examlpe = new byte[the size of the byte here] , i used BitConverter.ToInt32(datalength,0) cuz i received the length of the data in byte called datalength :D byte[] data = new byte[BitConverter.ToInt32(datalength, 0)]; // Creates a Byte for the data to be Received On stream.Read(data, 0, data.Length); //Receives The Real Data not the Size this.Invoke((MethodInvoker)delegate // To Write the Received data { txtLog.Text += System.Environment.NewLine + "Client : " + Encoding.Default.GetString(data); // Encoding.Default.GetString(data); Converts Bytes Received to String }); } }).Start(); // Start the Thread } public void ServerSend(string msg) { stream = client.GetStream(); //Gets The Stream of The Connection byte[] data; // creates a new byte without mentioning the size of it cuz its a byte used for sending data = Encoding.Default.GetBytes(msg); // put the msg in the byte ( it automaticly uses the size of the msg ) int length = data.Length; // Gets the length of the byte data byte[] datalength = new byte[4]; // Creates a new byte with length of 4 datalength = BitConverter.GetBytes(length); //put the length in a byte to send it stream.Write(datalength, 0, 4); // sends the data's length stream.Write(data, 0, data.Length); //Sends the real data } private void btnListen_Click(object sender, EventArgs e) { server.Start(); // Starts Listening to Any IPAddress trying to connect to the program with port 1980 MessageBox.Show("Waiting For Connection"); new Thread(() => // Creates a New Thread (like a timer) { client = server.AcceptTcpClient(); //Waits for the Client To Connect MessageBox.Show("Connected To Client"); if (client.Connected) // If you are connected { ServerReceive(); //Start Receiving } }).Start(); } private void btnSend_Click(object sender, EventArgs e) { if (client.Connected) // if the client is connected { ServerSend(txtSend.Text); // uses the Function ClientSend and the msg as txtSend.Text } } }}
Client:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading; namespace Client{ public partial class Form1 : Form { int i; TcpClient client; // Creates a TCP Client NetworkStream stream; //Creats a NetworkStream (used for sending and receiving data) byte[] datalength = new byte[4]; // creates a new byte with length 4 ( used for receivng data's lenght) public Form1() { InitializeComponent(); } private void btnConnect_Click(object sender, EventArgs e) { try { client = new TcpClient("127.0.0.1", 1980); //Trys to Connect ClientReceive(); //Starts Receiving When Connected } catch (Exception ex) { MessageBox.Show(ex.Message); // Error handler :D } } public void ClientReceive() { stream = client.GetStream(); //Gets The Stream of The Connection new Thread(() => // Thread (like Timer) { while ((i = stream.Read(datalength, 0, 4)) != 0)//Keeps Trying to Receive the Size of the Message or Data { // how to make a byte E.X byte[] examlpe = new byte[the size of the byte here] , i used BitConverter.ToInt32(datalength,0) cuz i received the length of the data in byte called datalength :D byte[] data = new byte[BitConverter.ToInt32(datalength,0)]; // Creates a Byte for the data to be Received On stream.Read(data, 0, data.Length); //Receives The Real Data not the Size this.Invoke((MethodInvoker)delegate // To Write the Received data { txtLog.Text += System.Environment.NewLine + "Server : " + Encoding.Default.GetString(data); // Encoding.Default.GetString(data); Converts Bytes Received to String }); } }).Start(); // Start the Thread } public void ClientSend(string msg) { stream = client.GetStream(); //Gets The Stream of The Connection byte[] data; // creates a new byte without mentioning the size of it cuz its a byte used for sending data = Encoding.Default.GetBytes(msg); // put the msg in the byte ( it automaticly uses the size of the msg ) int length = data.Length; // Gets the length of the byte data byte[] datalength = new byte[4]; // Creates a new byte with length of 4 datalength = BitConverter.GetBytes(length); //put the length in a byte to send it stream.Write(datalength, 0, 4); // sends the data's length stream.Write(data, 0, data.Length); //Sends the real data } private void btnSend_Click(object sender, EventArgs e) { if (client.Connected) // if the client is connected { ClientSend(txtSend.Text); // uses the Function ClientSend and the msg as txtSend.Text } } }}
I also have AES, DES and RSA classes, but I don't know how to tell if a message is a key or just a normal message...


Thank you