3

我有一个程序使用BinaryReaderBinaryWriter通过网络发送stringintbyte [] 消息。

消息的顺序和内容对于服务器和客户端的执行流程都很重要,但持续时间永远不会长。

现在我正在尝试加密所有内容。

这是我在实际代码周围的新包装器:

using encReaderStream = CryptoStream(clientStream, myAES.CreateDecryptor(), CryptoStreamMode.Read),\
      encWriterStream = CryptoStream(clientStream, myAES.CreateEncryptor(), CryptoStreamMode.Write),\
      enc_reader = BinaryReader(encReaderStream),\
      enc_writer = BinaryWriter(encWriterStream):
          ....

这个例子是 boo 代码,但在这个例子中它应该直观地等同于 C#。

现在发生的情况是,服务器正确地获得了第一条加密消息enc_reader.ReadString(),并以enc_writer.Write("Accepted"). 但客户永远得不到答案。

我已经测试了消息的顺序是否重要,并且确实如此。如果我从服务器发送一个字符串开始,那么客户端会得到它,但是如果我继续发送消息,我很快就会遇到同样的情况。

我有一些想法, CryptoStream 可能是导致无法与BinaryReader / BinaryWriter正常合作的原因,但我不知道如何以一种好的方式解决这个混乱。

我的服务器有很多只需要BinaryReaderBinaryWriter的函数,如果它们能像以前一样工作,那就太方便了。

编辑:

我还在这里的一个小型 C# 项目中复制了这种情况,使用上面提到的 AES 和 CTR 模式的实现。

4

1 回答 1

1

您不能在块中间刷新块密码,因为从算法的角度来看,这些字节还没有准备好。他们没有下定决心。

可能,最好的解决方法是使用流密码。.NET 对此的内置支持很差。拉入一个以计数器模式实现 AES 的库。

请注意,如果不使用经过身份验证的加密(而且看起来您不会这样做),攻击者可以编辑数据,尽管他们无法读取数据。使用 AES-GCM 来缓解。


后来我们发现你使用的CTR模式库坏了。用这个:

public int InputBlockSize { get { return 1; } }
public int OutputBlockSize { get { return 1; } }
于 2015-09-26T22:49:56.997 回答