How can I encrypt my message when sending to the server?

I would like to encrypt my message when sending to the server from the client, how can I do this?

customer

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.Sockets; using System.Threading; namespace SocketClient { public partial class SocketClient : Form { System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); NetworkStream serverStream = default(NetworkStream); string readData = null; public SocketClient() { InitializeComponent(); } private void getMessage() { while (true) { serverStream = clientSocket.GetStream(); int buffSize = 0; byte[] inStream = new byte[10025]; buffSize = clientSocket.ReceiveBufferSize; serverStream.Read(inStream, 0, buffSize); string returndata = System.Text.Encoding.ASCII.GetString(inStream); readData = "" + returndata; msg(); } } private void msg() { if (this.InvokeRequired) this.Invoke(new MethodInvoker(msg)); else textDisplay.Text = textDisplay.Text + Environment.NewLine + " >> " + readData; } private void buttonConnect_Click(object sender, EventArgs e) { readData = "Connected to NYP Chat Server ..."; msg(); //clientSocket.Connect("127.0.0.1", 8888); clientSocket.Connect(textIP.Text, Convert.ToInt32(textPort.Text)); serverStream = clientSocket.GetStream(); byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textName.Text + "$"); serverStream.Write(outStream, 0, outStream.Length); serverStream.Flush(); Thread ctThread = new Thread(getMessage); ctThread.Start(); } private void buttonSend_Click(object sender, EventArgs e) { // Show msg box if no server is connected if (serverStream == null) { MessageBox.Show("Please connect to a server first!"); return; } // Send text byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textSend.Text + "$"); serverStream.Write(outStream, 0, outStream.Length); serverStream.Flush(); // Clear text textSend.Text = ""; } private void textDisplay_TextChanged(object sender, EventArgs e) { textDisplay.SelectionStart = textDisplay.Text.Length; textDisplay.ScrollToCaret(); textDisplay.Refresh(); } private void textSend_TextChanged(object sender, EventArgs e) { buttonSend.Enabled = !string.IsNullOrEmpty(textSend.Text); } } } 

server

 using System; using System.Threading; using System.Net.Sockets; using System.Text; using System.Collections; namespace ConsoleApplication1 { class Program { public static Hashtable clientsList = new Hashtable(); static void Main(string[] args) { //TcpListener serverSocket = new TcpListener(portFromAppConfig); TcpListener serverSocket = new TcpListener(9999); TcpClient clientSocket = default(TcpClient); int counter = 0; serverSocket.Start(); Console.WriteLine("Welcome to NYP Chat Server "); counter = 0; while ((true)) { counter += 1; clientSocket = serverSocket.AcceptTcpClient(); byte[] bytesFrom = new byte[10025]; string dataFromClient = null; NetworkStream networkStream = clientSocket.GetStream(); networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); clientsList.Add(dataFromClient, clientSocket); broadcast(dataFromClient + " Connected ", dataFromClient, false); Console.WriteLine(dataFromClient + " has join the chat room "); handleClient client = new handleClient(); client.startClient(clientSocket, dataFromClient, clientsList); } clientSocket.Close(); serverSocket.Stop(); Console.WriteLine("exit"); Console.ReadLine(); } public static void broadcast(string msg, string uName, bool flag) { foreach (DictionaryEntry Item in clientsList) { TcpClient broadcastSocket; broadcastSocket = (TcpClient)Item.Value; NetworkStream broadcastStream = broadcastSocket.GetStream(); Byte[] broadcastBytes = null; if (flag == true) { broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg); } else { broadcastBytes = Encoding.ASCII.GetBytes(msg); } broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length); broadcastStream.Flush(); } } //end broadcast function }//end Main class public class handleClient { TcpClient clientSocket; string clNo; Hashtable clientsList; public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList) { this.clientSocket = inClientSocket; this.clNo = clineNo; this.clientsList = cList; Thread ctThread = new Thread(doChat); ctThread.Start(); } private void doChat() { int requestCount = 0; byte[] bytesFrom = new byte[10025]; string dataFromClient = null; Byte[] sendBytes = null; string serverResponse = null; string rCount = null; requestCount = 0; while ((true)) { try { requestCount = requestCount + 1; NetworkStream networkStream = clientSocket.GetStream(); networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); Console.WriteLine("From client - " + clNo + " : " + dataFromClient); rCount = Convert.ToString(requestCount); Program.broadcast(dataFromClient, clNo, true); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }//end while }//end doChat } //end class handleClient }//end namespace 
+1
source share
4 answers

The absolute easiest way is to copy all the code you wrote and just use WCF.

The next simplest way is to use a secure stream instead of a raw network stream, such as SslStream or NegotiateStream . Here's a complete sample in the Secure Streams Sample , which shows both the client and server for the NTLM / Kerberos and SChannel protocols (also known as SSL / TLS).

One thing you should absolutely not do is write your own encryption. Message encryption is trivial, and you will find many patterns on the Internet. But creating a key exchange protocol, so that you have something to encrypt, is one of the most difficult tasks in cryptography. Use one of the commonly accepted key exchange schemes, such as Kerberos or SSL / TLS, and they are already implemented in two related stream classes.

+3
source

Have a look in this article . It shows symmetric encryption / decryption methods.

0
source

C # provides a namespace for cryptography System.Security.Cryptography ... for starters, you can check this out ... Or try to implement a cryptography algorithm like Vernamm, which is the simplest and easiest to implement. Or, if you want to be fully protected, you should use the System.Security.Cryptography namespace System.Security.Cryptography.X509Certificates namespace.

0
source
0
source

Source: https://habr.com/ru/post/944478/


All Articles