gpt4 book ai didi

c# - 加密的 NetworkStream 卡在 ReadLine() 上

转载 作者:可可西里 更新时间:2023-11-01 02:40:54 25 4
gpt4 key购买 nike

我正在学习如何使用下面的简单示例来加密网络流。没有加密这个例子工作正常,但现在我已经添加了 CryptoStreams,服务器在客户端写入消息并刷新后卡在“var data = reader.ReadLine()”上。

    static byte[] Key;
static byte[] IV;

static void Main(string[] args)
{
var svrTask = RunServer();
RunClient();
svrTask.Wait();
}
static async Task RunServer ()
{
var listener = new TcpListener(4567);
var algo = new RijndaelManaged();
listener.Start();
var client = await listener.AcceptTcpClientAsync();

using (var stream = client.GetStream())
using (var inputStream = new CryptoStream(stream, algo.CreateDecryptor(Key, IV), CryptoStreamMode.Read))
using (var outputStream = new CryptoStream(stream, algo.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
{
var reader = new StreamReader(inputStream);
var writer = new StreamWriter(outputStream);
var data = reader.ReadLine(); // Task hangs here
writer.WriteLine("Server Received: " + data);
writer.Flush();
}
client.Close();
listener.Stop();
}
static void RunClient ()
{
var algo = new RijndaelManaged();
Key = algo.Key;
IV = algo.IV;

var client = new TcpClient("localhost", 4567);
using (var stream = client.GetStream())
using (var inputStream = new CryptoStream(stream, algo.CreateDecryptor(Key, IV), CryptoStreamMode.Read))
using (var outputStream = new CryptoStream(stream, algo.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
{
var writer = new StreamWriter(outputStream);
Console.WriteLine("Client will send: ");
var data = Console.ReadLine();

writer.WriteLine(data);
writer.Flush();

var reader = new StreamReader(inputStream);
var response = reader.ReadLine();
Console.WriteLine("Client received: " + response);
}
}

我很确定我遗漏了一些非常简单的东西。首先想到的是加密扰乱了新行字符的发送,导致服务器在等待分隔符时挂起,但我无法发现问题。

如有任何帮助,我们将不胜感激。

最佳答案

在您写完一行之后,很可能没有一个完整的加密数据 block 准备好发送。你不能直接对此做任何事情。你不能冲洗半个街区。

最好的做法是完全放弃这种方法并使用现成的解决方案,例如 WCF 或 HTTPS。你为什么要搞乱套接字呢?套接字和加密都非常困难。例如,你的加密是不安全的,因为攻击者可以在你不知情的情况下更改消息。他可以翻转位。

下一个最好的办法是在发送消息后关闭连接。我不确定这在这里如何工作。 CryptoStream.Flush 可能有效。

或者,使用计数器模式 (CTR),使 block 大小为 1 字节。这不受任何内置的支持。你需要一些图书馆。

关于c# - 加密的 NetworkStream 卡在 ReadLine() 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29167940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com