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