繁体   English   中英

通过网络加密字符串,c#

[英]Encrypting a string over network, c#

我正在尝试创建一个发送和接收字符串的客户端服务器程序(它是一个简单的局域网聊天应用程序)。

该程序工作正常,但我需要加密它,这就是问题,当我使用加密时,它似乎在每次发送数据后关闭连接,我需要重新运行它以接收更多的消息(我不能,因为它的聊天,应该不断)

顺便说一句,即使它的加密很弱,我也不介意,只要它不是纯文本就可以了。

这是我的程序(服务器)的一面:

public static void Main()
   {
      string data;
      IPEndPoint ip = new IPEndPoint(IPAddress.Any, 9999);

      Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

      socket.Bind(ip);
      socket.Listen(10);

      Socket client = socket.Accept();
      IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
      Console.WriteLine("Connected with {0} at port {1}",newclient.Address, newclient.Port);

      NetworkStream ns = new NetworkStream(client);
      StreamReader sr = new StreamReader(ns);
      StreamWriter sw = new StreamWriter(ns);

      string welcome = "Welcome";
      sw.WriteLine(welcome);
      sw.Flush();

      while(true)
      {
         data = sr.ReadLine();
         Console.WriteLine(data);
         sw.WriteLine(data);
         sw.Flush();
      }
      Console.WriteLine("Disconnected from {0}", newclient.Address);
      sw.Close();
      sr.Close();
      ns.Close(); 
   }

以下是我尝试用于加密的代码示例:(服务器)IPAddress IP2 = IPAddress.Parse(IP); TcpListener TCPListen = new TcpListener(IP2,port);

                TCPListen.Start();

            TcpClient TCP = TCPListen.AcceptTcpClient();


            NetworkStream NetStream = TCP.GetStream();




            RijndaelManaged RMCrypto = new RijndaelManaged();


            byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
            byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };




            CryptoStream CryptStream = new CryptoStream(NetStream,
               RMCrypto.CreateDecryptor(Key, IV),
               CryptoStreamMode.Read);

            StreamReader SReader = new StreamReader(CryptStream);




            message = SReader.ReadToEnd();

            textBox3.Clear();

            textBox3.Text = message;

            CryptStream.Flush();

            SReader.Close();







            NetStream.Flush();

            NetStream.Close();

            TCPListen.Stop();
            TCP.Close();

我试图只刷新netstream和cryptstream所以可以保持连接打开。

您是否考虑过简单地使用SSL进行套接字通信? (指定SslProtocols.Tls)。

自C#2.0以来,SSL Socket支持一直在.NET中。


如果您希望保持代码与现在大致相同,只需使用加密二进制数据编码,这可能会解决您的问题。 例如Convert.ToBase64String发送之前。

你应该看看TLS。

它并不是真的很复杂,而且它和它一样安全。

这里有一个.NET教程:

http://www.codeproject.com/KB/IP/sslclasses.aspx

好好阅读代码它应该永远不会停止写数据,因为它有一段while(true)没有任何退出条件。

在什么情况下服务器关闭连接? 它可能会查找特定字符,您的加密输出是否包含此字符?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM