首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个BinaryReader上使用BinaryWriter和BinaryWriter时,如何避免超时?

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

Stack Overflow用户
提问于 2015-09-26 21:20:04
回答 1查看 472关注 0票数 3

我有一个使用BinaryReader和BinaryWriter通过网络发送字符串、int和byte[]消息的程序。

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

现在我想加密所有的东西。

这是我对实际代码的新包装器:

代码语言:javascript
复制
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的函数,如果它们能像以前一样工作的话会非常方便。

编辑:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-26 22:49:56

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

也许,最好的解决办法是使用流密码。.NET在这方面的内部支持很差。进入一个以计数器模式实现AES的库。

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

后来,我们发现您正在使用的CTR模式库已经损坏。用这个:

代码语言:javascript
复制
public int InputBlockSize { get { return 1; } }
public int OutputBlockSize { get { return 1; } }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32802134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档