Winapi CryptoEncrypt()是线程安全的吗?

Winapi CryptoEncrypt()是线程安全的吗?,winapi,thread-safety,cryptoapi,Winapi,Thread Safety,Cryptoapi,微软: CryptEncrypt函数不能保证线程安全,如果由多个调用方同时调用,则可能返回不正确的结果 这是否意味着该函数修改全局数据? 或者这仅仅意味着不能同时使用同一个散列/密钥 (换句话说,下面的注释正确吗?我认为这意味着不能同时分叉多个进程来使用它,因为函数使用共享地址空间。它可以访问所有线程的内存,因此将给您意外的结果。只有在应用程序执行多线程时,这才是问题。它的意思是:函数不能保证线程安全。它可能有一个内部静态(或全局)状态,但这是一个实现细节 是否使用相同的散列或键无关紧要 注释

微软:

CryptEncrypt
函数不能保证线程安全,如果由多个调用方同时调用,则可能返回不正确的结果

这是否意味着该函数修改全局数据?
或者这仅仅意味着不能同时使用同一个散列/密钥


(换句话说,下面的注释正确吗?

我认为这意味着不能同时分叉多个进程来使用它,因为函数使用共享地址空间。它可以访问所有线程的内存,因此将给您意外的结果。只有在应用程序执行多线程时,这才是问题。

它的意思是:函数不能保证线程安全。它可能有一个内部静态(或全局)状态,但这是一个实现细节

是否使用相同的散列或键无关紧要


注释后编辑:根据,CryptoApi密钥句柄不是线程安全的,因为内部密钥状态:

大多数算法和模式要求数据按加密顺序解密。在多线程环境中,这是一项困难的任务,因为使用关键部分不会解决排序问题。如果在ECB密码模式下使用分组密码(即RC2、DES或3DES),则此问题不是一个因素,因为内部密钥状态不会更改。但是,ECB不是默认的密码模式。CBC是默认的密码模式。使用CBC密码模式时,内部密钥状态会发生变化


因此,毕竟,如果多个线程不共享同一密钥,那么您确实可以在多个线程上使用
CryptEncrypt
,这似乎是合理的。不过,这只是一个猜测。

。。。分叉过程?在Win32上?只是一种预感,或者任何能证实这一说法的东西?(我也能猜到,但我希望有更具体的东西…)啊,现在这是一个很棒的更新。:-)谢谢,这解释了很多+1.