【问题标题】:Rijndael algorithm and CryptoStream: is it possible to encrypt / decrypt multithreaded?Rijndael 算法和 CryptoStream:是否可以加密/解密多线程?
【发布时间】:2011-12-13 11:17:37
【问题描述】:

我正在使用 Rijndael 加密/解密一些文档。我想知道是否存在允许多线程使用算法的 C# 实现,无论是手动还是使用 Parallel 框架?我认为这是不可能的,因为它基于流(CryptoStream),但仍然值得一问。 有人有资料可以查吗?

【问题讨论】:

    标签: c# .net multithreading encryption


    【解决方案1】:

    我从未听说过 .NET 中的多线程 CryptoStream,但是,我认为这取决于您的加密模式。 如果加密模式是 ECB,当然,你可以很容易地用 Parallel.For 或 ForEach 手动使它成为多线程。 使用 CBC 或任何其他带有反馈的加密模式,您不太可能使其并行,除非您将使用多个初始化向量。 对于欧洲央行模式:

    • 将数据拆分为多个字节数组(假设您使用 10 个线程加密 1280 个字节,将数据拆分为包含 0..127 字节、128..255 字节等的 10 个字节数组,每个数组必须包含整数块)。
    • 使用 Parallel.For 或 ForEach 循环所有 10 字节数组(例如,创建 List 实例并将其作为参数提供给 Parallel.ForEach)。
    • 使用 SymmetricAlgorithm.CreateEncryptor/SymmetricAlgorithm.CreateDecryptor 创建 10 个 Rijndael 加密器/解密器实例
    • 在单独的线程上加密数据的每一部分。
    • 再次将数据合并到 1000 字节数组中。

    所以,我的想法是不使用 CryptoStream,而是必须调用加密 API 并直接操作纯文本字节。

    【讨论】:

    • 这占用了太多内存。最好有两个或更多流,每个流传输文件的一部分。
    • @Krumelur 是的,您说得对,您可以启动多个流,而不是创建字节数组(例如,从不同文件位置开始以共享模式读取文件)。对于 ECB 模式,加密文件的顺序无关紧要,这就是 ECB 模式适合并行化的原因。因此,创建 10 个 ECB CryptoStream 实例并将它们提供给 Parallel.ForEach 也是解决方案。但是,您必须注意并禁用自动填充,否则 CryptoStream 将填充 10 个或更多线程中的每一个,并在您的文件中写入额外的块。必须禁用填充。
    • 听起来很有趣。您是否尝试过,或者它只是简单的理论? (如果你知道它有效,我会先尝试一下,如果是理论,我将不得不暂时推迟)
    • 欧洲央行不安全。 CTR 模式可以并行化,稍加注意,并且更安全。
    • CTR 模式加密使用密码流,您可以将其与纯文本异或(用于编码和解码)。所以你可以有一个缓冲区,例如由多个线程填充,每个线程都持有密钥的副本。然后,您只需将文档中的数据与密文进行异或运算。无论如何,IO 可能都会成为瓶颈,但这超出了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多