我有一个使用BinaryReader和BinaryWriter通过网络发送字符串、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的函数,如果它们能像以前一样工作的话会非常方便。
编辑:
我还在一个小型C#项目这里中复制了这种情况,使用了上述的带有CTR模式的AES实现。
发布于 2015-09-26 22:49:56
您不能在块中间刷新块密码,因为从算法的角度来看,这些字节还没有准备好。他们没有决心。
也许,最好的解决办法是使用流密码。.NET在这方面的内部支持很差。进入一个以计数器模式实现AES的库。
请注意,如果不使用经过身份验证的加密(它看起来不像您要做的那样),攻击者可以编辑数据,尽管他们无法读取数据。使用AES-GCM来减轻。
后来,我们发现您正在使用的CTR模式库已经损坏。用这个:
public int InputBlockSize { get { return 1; } }
public int OutputBlockSize { get { return 1; } }https://stackoverflow.com/questions/32802134
复制相似问题