【问题标题】:Encrypting a string over network, c#通过网络加密字符串,c#
【发布时间】:2011-03-11 17:52:10
【问题描述】:

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

程序运行良好,但我需要对其进行加密,这就是问题所在,当我使用加密时,似乎每次发送数据后它都会关闭连接,我需要重新运行它才能接收进一步的消息(我不能,因为它正在聊天,应该不断)

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

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

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,以便保持连接打开。

【问题讨论】:

    标签: c#


    【解决方案1】:

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

    自 C# 2.0 起,.NET 就支持 SSL 套接字。


    如果您想让您的代码与现在的代码基本相同,只需对加密的二进制数据使用编码,这可能会解决您的问题。例如发送前Convert.ToBase64String

    【讨论】:

    • 对不起,如果我问了这么愚蠢的问题,我是初学者,让我看看我是否做对了,你的意思是不要使用任何加密,而是在它通过网络并打开时更改编码对方再次转换为 32 基数对吗?
    • @user363295:没有愚蠢的问题。如果您真的不关心安全性,我想您可以在发送之前简单地对字符串进行 base64 编码,并在收到后立即进行 base64 解码。这不是加密的替代品,尽管它只是摆脱了明文。如果他们愿意,一个人可以在纸上算出来。
    • 编码文本和加密文本完全不同。对文本进行编码不会使其无法访问,它只是改变了保存文本的方式,文本对黑客来说是可见的(如果你担心的话,可以点击你的 LAN 的人可以轻松读取 Base64 字符串)。加密是保证您的通信安全的唯一方法。不编码。回答没有冒犯,但我认为提出问题的人需要知道这一点。
    • VOX:同意,我在上面明确提到过。被接受的答案是对base64加密数据进行安全传输。我在上面留下的评论明确指出它不是加密,甚至有人可以用纸和铅笔对其进行解码。
    【解决方案2】:

    你应该看看 TLS。

    这并不复杂,而且很安全。

    .NET 教程可在此处获得:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这是一个聊天,它从一侧读取并从另一侧写入 netstream,直到你关闭程序(循环永远不会结束)。
      • 那么Disconnected from {} 代码的意义何在,因为它永远不会到达那里?它也永远不会正确关闭连接资源。同样,服务器何时关闭连接?导致问题的加密示例在哪里?
      • 这里没有足够的空间放代码,所以我将编辑问题。
      • 是的,你是对的,它永远不会到达那个 Console.WriteLine("Disconnected from {0}", newclient.Address);所以它服务器永远不会关闭连接。
      • 在您的示例中,您正在调用 TCPListen.Stop();TCP.Close();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多