Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非对称TCP加密#_C#_.net_Encryption_Ssl_Tcp - Fatal编程技术网

C# 非对称TCP加密#

C# 非对称TCP加密#,c#,.net,encryption,ssl,tcp,C#,.net,Encryption,Ssl,Tcp,我想写一个客户端和服务器应用程序,它使用tcp套接字进行通信。但是,我不需要证书,因为用户不关心对方是谁。但我确实需要不对称加密,这样就没有人可以窥探了。我想不出使用RSA共享对称密钥的方法,但无论如何,我认为应该使用SSL和TCP 在C#中创建SSL/TCP连接的最佳方法是什么?我想我要么不指定证书,要么动态创建一个证书(但它们应该是一次性的…)。实现它最简单的方法是什么?我试着简单地向我的tcp流添加一个sslstream,但这并没有阻止它(我得到流不可读的错误)。这是我到目前为止的简单代码

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

在C#中创建SSL/TCP连接的最佳方法是什么?我想我要么不指定证书,要么动态创建一个证书(但它们应该是一次性的…)。实现它最简单的方法是什么?我试着简单地向我的tcp流添加一个sslstream,但这并没有阻止它(我得到流不可读的错误)。这是我到目前为止的简单代码

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

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

要创建自签名证书(即丢弃),请参阅

这里还有一个循序渐进的例子


确保你理解了其中的含义,也就是说,当你没有实际验证所提供的证书时,中间的人可能会阻止你的流量。换句话说,这根本不是一种身份验证形式(正如链接答案中所建议的那样),而只是一种与某人进行私人通信的方式,但你并不确切知道与谁进行了通信。另一种方法是使用根证书对使用的每个一次性证书进行签名,并验证客户端中的证书链,但与博客链接相比,这会使证书的生成变得非常复杂。

如果要防止MITM攻击,您始终需要检查服务器的身份。(不验证证书最多只能保护您免受被动窃听。)