不对称的TCP加密 C#

4
我想编写一个客户端和服务器应用程序,使用TCP套接字进行通信。然而,由于用户不关心对方是谁,因此我不需要证书。但是,我需要非对称加密,以防止任何人窥探。我无法想到在不使用RSA的情况下共享对称密钥的方法,但无论如何,我认为我应该使用TCP的SSL?
在C#中创建SSL/TCP连接的最简单方法是什么?我想要指定没有证书或动态创建一个(但它们应该是一次性的...)。实现它的最简单方法是什么?我尝试将sslstream添加到我的tcp流中,但这样做不起作用(我得到“流不可读”错误)。以下是我的简单代码:
    {
        Thread serverThread = new Thread((ThreadStart)delegate
        {
            TcpListener listener = new TcpListener(1234);
            listener.Start();
            using (TcpClient client = listener.AcceptTcpClient())
            //using (var sslstream = client.GetStream())
            using (var sslstream = new System.Net.Security.SslStream(client.GetStream(), true))
            using (StreamReader reader = new StreamReader(sslstream))
            using (StreamWriter writer = new StreamWriter(sslstream))
            {
                writer.AutoFlush = true;
                string inputLine;
                while ((inputLine = reader.ReadLine()) != null)
                {
                    writer.WriteLine(inputLine);
                }
            }
        });
        serverThread.Start();
        {
            string[] linesToSend = new string[] { "foo", "bar", "ack" };
            using (TcpClient client = new TcpClient("127.0.0.1", 1234))
            //using (var sslstream = client.GetStream())
            using (var sslstream = new System.Net.Security.SslStream(client.GetStream(), true))
            using (StreamReader reader = new StreamReader(sslstream))
            using (StreamWriter writer = new StreamWriter(sslstream))
            {
                writer.AutoFlush = true;
                foreach (string lineToSend in linesToSend)
                {
                    Console.WriteLine("Sending to server: {0}", lineToSend);
                    writer.WriteLine(lineToSend);
                    string lineWeRead = reader.ReadLine();
                    Console.WriteLine("Received from server: {0}", lineWeRead);
                    //Thread.Sleep(2000); // just for effect
                }
                Console.WriteLine("Client is disconnecting from server");
            }
        }
        serverThread.Join();
    }

2
如果您想受到MITM攻击的保护,您始终需要检查服务器的身份。 (不验证证书最多只能保护您免受被动窃听的侵害。) - Bruno
1个回答

5
您需要为 LocalCertificateSelectionCallback 提供一个实现来选择要使用的证书,还需要为 RemoteCertificateValidationCallback 提供一个实现来接受对等方使用的自签名证书。
要创建自签名证书(即一次性使用),请参见在C#中创建自签名证书
此处还有一个逐步示例:使用SSL和SslStream进行对等身份验证
请确保理解其含义,即中间人可以窃听您的流量,因为您实际上没有验证所呈现的证书。换句话说,这根本不是一种身份验证方式(如SO链接答案中所建议的那样),而只是与某人进行私人通信的方法,但您并不真正知道与谁通信。另一种选择是使用根证书来签署每个一次性使用的证书,并在客户端验证证书链,但与博客链接相比,这会显著增加证书的生成复杂性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接