如何使用多线程 Crypto API 加密文件?

How to encrypt a file using Crypto API with multiple threads?

我正在尝试使用多线程加密文件并使用 Crypto API / AES256 / CBC 模式 / NO IV(初始化向量)。

我将文件分成尽可能多的线程。获取文件最后一个块的线程执行 CryptEncrypt 传递 Final 为真。

遵循建议的方法here:每个线程使用一个重复的键。

此外,每个线程都以共享读取模式打开源文件并从分配的偏移量开始读取,保持加密并写入目标文件(再次以共享写入模式打开)作为适当的偏移量。

在单线程和多线程的情况下我得到的输出文件不一样并且散列不匹配。我做错了什么?

你不能那样做。 IV 或链接模式在这里无关紧要(尽管某些链接模式允许并行性 - 但它的实现)。考虑对以下文本进行加密:

"Block cipher mode of operation"

你以某种方式划分它(2 个线程):

  • "Block cipher mo"
  • " de of operation"

您如何确定它(由 OS 调度程序)以相同的顺序执行?如果分成3个线程,可能是:

  • "Block ciphe"
  • "r mode o"
  • "f operation"

但它可能会被执行为:

  • "r mode o"
  • "f operation"
  • "Block ciphe"

如您所料,最终结果会有所不同!

此外,在 CBC 模式下,结果取决于之前的结果,mentioned here。看,在右侧,CBC 不可并行化。