【发布时间】:2019-12-25 12:34:43
【问题描述】:
有没有什么方法可以使用来自 .Net 的体面的对称加密(也许我遗漏了一些东西)来实现将源字节数组加密到目标字节数组(都预先分配)?还是我必须查看或编写自定义 AES 加密系统?
我需要字节数组到字节数组的原因解释如下:
我正在为现有的基于 C# Socket 的服务器添加加密。服务器使用 Socket.Select 处理大量非阻塞客户端套接字,这些套接字不时在很少的线程上发送相对较小的数据块。此外,服务器在速度和内存分配方面高度优化。服务器是围绕发送和接收最大 16k 字节的数据块(通常只有几百个实际交换,很少 1-2k)的想法构建的。所有这些块都被重复使用以避免分配。
我尝试过使用 .Net 的 SslStream,但没有找到使用它的方法 许多线程或.Net async/begin-end 机制 - 似乎在大约 100 多个客户端(取决于操作系统和机器功率)中窒息。使用 SslStream 我可以使用服务器分配的内存块,但由于涉及到流(tcp 和 ssl),我不能以安全的方式使用 Socket.Select。
我的下一步是尝试手动实现 SSL 套接字。我可以将服务器的公钥传输给客户端,在那里我使用 RijndaelManaged 生成一个新的对称密钥,然后我使用服务器的公钥对其进行加密并将其发送回服务器。一切都很好,但是如果没有 ICryptoTransform,我找不到使用 RijndaelManaged 加密的方法,它有两个问题:我必须使用 CreateEncryptor 创建大量 ICryptoTransform(导致内存混乱),并且它还会生成一个新的字节数组每次加密后都会为 GC 带来更多工作。
【问题讨论】:
-
不清楚为什么不能使用(和池化)MemoryStreams? RijndaelManagedTransform 还将
CanReuseTransform设置为true -
可以,但是 ICryptoTransform.TransformFinalBlock 每次都会返回一个新的字节数组。
标签: c# aes encryption-symmetric