C# 重建加密流需要多少开销?

C# 重建加密流需要多少开销?,c#,encryption,C#,Encryption,过去几天我一直在为一个问题绞尽脑汁:在完成公钥交换+登录后,我的端点切换到Rijndael对称加密模式来加密客户端和服务器之间的消息 问题是,我创建了cryptostream并将其保持打开状态,认为这是最好的方式,因为该通道将用于发送多个连接。当我这样做时,加密永远不会完全输出到基流。根据msdn,它说: 您应该始终在完成后显式关闭CryptoStream对象 通过调用Close方法来完成。这样做会刷新整个系统 流,并使所有剩余的数据块由 加密流对象 对于发送的每一条消息,重新构建它似乎需要很大

过去几天我一直在为一个问题绞尽脑汁:在完成公钥交换+登录后,我的端点切换到
Rijndael
对称加密模式来加密客户端和服务器之间的消息

问题是,我创建了cryptostream并将其保持打开状态,认为这是最好的方式,因为该通道将用于发送多个连接。当我这样做时,加密永远不会完全输出到基流。根据msdn,它说:

您应该始终在完成后显式关闭CryptoStream对象 通过调用Close方法来完成。这样做会刷新整个系统 流,并使所有剩余的数据块由 加密流对象


对于发送的每一条消息,重新构建它似乎需要很大的开销。有什么原因吗,或者我只是遗漏了什么?

AES(Rijndael)使用固定大小的块,所以输出可以是块大小的倍数。如果输入未与块大小对齐,则对其进行填充。解密时,此填充将被删除。要知道要添加多少填充,AES需要知道确切的流长度。当流结束时(关闭后),可以确定该长度。

哦,那么关闭它会告诉流大小有多大?小心:当从这样的AES创建更复杂的协议时;很容易犯微妙的错误,完全破坏加密。请使用现有的协议(TLS)而不是使用您自己的密码系统。我以为使用Rijndael是使用现有的密码系统?不,它只是一个加密算法。正确使用非常复杂-即使是常用的SSL/TLS协议最初也因AES使用不当(BEAST攻击等)而被破坏,必须进行更新。你有我可以阅读的资源吗?也许是推荐书?我想正确地做这件事。特别是,我认为您的问题中描述的协议是易受攻击的,因为它不使用消息身份验证;在“重建”加密流时,您可能也会遇到IV重用问题。我没有看到任何关于签名的信息,所以也许一个简单的MITM攻击也能奏效。鉴于AES使用填充,您可能成为填充oracle攻击的受害者。潜在的陷阱数量巨大-->使用现有的解决方案,不要使用自己的解决方案!