在同一个CryptoStream上使用BinaryReader和BinaryWriter时,如何避免超时?

时间:2015-09-26 21:20:04

标签: c# binaryreader cryptostream

我有一个程序使用 BinaryReader BinaryWriter 发送 string int byte []网络上的消息。

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

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

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

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 正常合作,但我不知道如何理解这个烂摊子的好处方式。

我的服务器有很多功能只需要 BinaryReader BinaryWriter ,如果它们可以像以前一样工作,那将非常方便。

编辑:

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

1 个答案:

答案 0 :(得分:1)

您无法在块中间刷新块密码,因为从算法角度来看,这些字节尚未就绪。他们没有下定决心。

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

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

稍后我们发现您使用的CTR模式库已损坏。使用此:

public int InputBlockSize { get { return 1; } }
public int OutputBlockSize { get { return 1; } }