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

Windows 如何使用多线程加密API加密文件?,windows,visual-c++,aes,encryption-symmetric,cryptoapi,Windows,Visual C++,Aes,Encryption Symmetric,Cryptoapi,我尝试使用多线程加密文件,并使用加密API/AES256/CBC模式/否IV(初始化向量) 我将文件划分为尽可能多的线程。获取文件最后一个块的线程执行CryptEncrypt,并将Final作为true传递 按照建议的方法:每个线程使用一个重复的键 此外,每个线程以共享读取模式打开源文件,并开始从分配的偏移量读取,并根据适当的偏移量对目标文件(再次以共享写入模式打开)进行加密和写入 我在单线程和多线程的情况下得到的输出文件不相同,并且散列不匹配。我做错了什么?你不能那样做。IV或链接模式在这里是

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

我将文件划分为尽可能多的线程。获取文件最后一个块的线程执行CryptEncrypt,并将Final作为true传递

按照建议的方法:每个线程使用一个重复的键

此外,每个线程以共享读取模式打开源文件,并开始从分配的偏移量读取,并根据适当的偏移量对目标文件(再次以共享写入模式打开)进行加密和写入


我在单线程和多线程的情况下得到的输出文件不相同,并且散列不匹配。我做错了什么?你不能那样做。IV或链接模式在这里是不相关的(尽管某些链接模式允许并行性,但它的实现是is)。考虑执行以下文本的加密:

"Block cipher mode of operation"
以某种方式将其划分为两个线程:

  • “分组密码mo”
  • “取消操作”
如何确保它以相同的顺序执行(由OS调度器执行)?如果将其划分为3个线程,则可能是:

  • “块密码”
  • “r模式o”
  • “f操作”
但它可能会被执行为:

  • “r模式o”
  • “f操作”
  • “块密码”
正如你所猜测的那样,最终的结果将是不同的


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

重要的是链接模式。序列不是这样的,因为每个线程每次写入目标文件中的适当偏移量时都会这样做。是的,但CryptoAPI可能使用一些TLS变量,这意味着内部的每个加密程序线程对这些变量具有不同的值(因为它们是线程的本地变量)。我们不知道MS是如何实现的。依我看,出于性能原因,这些内部变量不会被其他加密线程“共享”。@AbhishekJain从不使用。它是确定性的,因此在语义上不安全。你至少应该使用随机模式,比如,但是你必须自己管理计数器。谢谢@ArtjomB。我只是想弄清楚这个问题,当然我不会使用欧洲央行。我将使用多线程加密,在一次加密多个文件时,每个线程将处理一个文件。你有很多问题都有很好的答案,但你很少接受答案。请通过接受更多问题的答案来奖励帮助过你的人。