【发布时间】:2015-06-04 07:59:30
【问题描述】:
在你说使用Jon Skeet's answer之前,我不能。
我是using this stream,一开始很好,但现在,我遇到了一个小问题。我现在处于一个我不知道我期望的数据量的地步,所以我认为我会使用 Jon Skeet 提供的方法,但不幸的是,当所有数据包都被读取后,它会等待 packet = mPackets.Take()。
我不知道如何解决这个问题,流做了它应该做的事情(在开始时),但不幸的是,这是一个我不希望它做它应该做的事情的场合......
我应该尝试重写waitingstream 还是有其他readall 方法在我的情况下效果更好?
我尝试在没有更多可用数据包时返回 0(当我希望它读取所有数据而不是等待时)但随后它会抛出一个 IO end of stream exception。
在这里我真的很茫然,我知道我已经为自己挖了一个很深的洞......
到目前为止,我还没有找到比从总长度中减去 TLS 标头、GCM IV 和 MAC 更好的解决方案(如下所述)这对于我现在使用的 1 个套件来说很好,但确实不能为未来的密码套件吹嘘。
关于我为什么这样做的一些背景:
我正在使用https://github.com/bcgit/bc-csharp 创建基于 TLS 的加密,但是由于限制,我无法为其分配 TCP 流,我得到的只是来自 TCP 层的字符串,我无法为其提供适当的 TCP 流。
我正在使用mockPskTlsServer and client,我已经这样创建了它:
WaitingStream mStdin = new WaitingStream();
WaitingStream mStdout = new WaitingStream();
CryptoPskTlsClient mServer = new CryptoPskTlsClient(null);
SecureRandom secureRandom = new SecureRandom();
TlsClientProtocol TlsProtocol = new TlsServerProtocol(Stdin, Stdout, secureRandom);
TlsProtocol.Connect(mServer);
这很好用,我还在等待流中添加了一个事件,该事件在流有输出时触发。这样我就可以在创建多个握手消息时获得它们。
这一切都很好,本可以做得更好(更少......被黑客入侵?)但它做了它应该做的事情。
我确实知道让它工作的方法,但这是一个 HACK,我正在寻找一种优雅的方法来做到这一点。这是其中一个 HACKS 的代码示例:
public override string DecryptData(string ciphertext)
{
byte[] ciphertextBuff = ASCIIEncoding.Default.GetBytes(ciphertext);
mStdin.Write(ciphertextBuff, 0, ciphertextBuff.Length);
Stream tlsStream = mServerProtocol.Stream;
byte[] plaintextBuffer = new byte[ciphertextBuff.Length - 29];//filthy HACK 29 bytes bij AES-GCM want TLS packet = 5, GCM IV = 8, GCM-MAC = 16 totaal = 29.
Streams.ReadFully(tlsStream, plaintextBuffer);
string plaintext = ASCIIEncoding.Default.GetString(plaintextBuffer);
return plaintext;
}
或通过将 x 保留字节中的明文长度添加到 TLS 数据包并在解密之前检索这些字节。
但是从代码示例中可以清楚地看到,readfully 方法中的缓冲区必须是我要提取的字节长度,它可以小于流的长度,但不能更多,因为它会等待无限期。
当我谈到 ReadAll 和 ReadFully I mean these methods 之类的方法时
【问题讨论】:
-
你不能用
TryTake代替Take吗? -
不确定我是否理解您的问题(最初的问题或这个问题)。为什么要替换初始的 TcpClient Networkstream?
-
@SimonMourier 因为我无法访问 TcpClient 网络流。我只有字符串。
-
@DanielHilgarth 但是当超时超过我该怎么办,我仍然需要返回一些东西,我不能返回 0,因为它会抛出一个异常
标签: c# ssl stream bouncycastle