非对称TCP加密C#

时间:2012-07-09 17:23:13

标签: c# .net encryption ssl tcp

我想编写一个使用tcp套接字进行通信的客户端和服务器应用程序。但是我不需要证书,因为用户不关心对方是谁。但我确实需要非对称加密,所以没有人可以窥探。我无法想到使用RSA分享对称密钥的方法,但无论如何我认为我应该使用SSL与TCP?

在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();
    }

1 个答案:

答案 0 :(得分:5)

您需要提供LocalCertificateSelectionCallback的实现来选择要使用的证书,并且您需要为RemoteCertificateValidationCallback提供实现以接受对等方使用的自签名证书。

要创建自签名证书(即丢弃),请参阅Creating a self-signed certificate in C#

此处还有Using SSL and SslStream for peer to peer authentication上的SO的分步示例。

确保你理解其含义,即。如果您实际上没有验证所提供的证书,那么中间人可以放弃您的流量。换句话说,这根本不是身份验证的形式(如SO链接答案所示),但只是一种与某人进行私密交流的方式,但是你不要我真的知道究竟是谁。另一种方法是使用根证书来签署所使用的每个丢弃证书并验证客户端中的证书链,但与博客链接相比,这会显着复制证书的生成。