マイクロソフトは次のように述べています。
この
CryptEncrypt
関数はスレッド セーフであることが保証されておらず、複数の呼び出し元によって同時に呼び出されると、正しくない結果が返される可能性があります。
これは、関数がグローバル データを変更することを意味しますか?
それとも、同じハッシュ/キーを同時に使用できないということですか?
(つまり、以下のコメントは正しいですか?)
マイクロソフトは次のように述べています。
この
CryptEncrypt
関数はスレッド セーフであることが保証されておらず、複数の呼び出し元によって同時に呼び出されると、正しくない結果が返される可能性があります。
これは、関数がグローバル データを変更することを意味しますか?
それとも、同じハッシュ/キーを同時に使用できないということですか?
(つまり、以下のコメントは正しいですか?)
つまり、関数はスレッドセーフであることが保証されていません。おそらく内部の静的 (またはグローバル) 状態がありますが、それは実装の詳細です。
同じハッシュまたはキーを使用するかどうかは関係ありません。
コメント後に編集:この MSDN ページによると、内部キーの状態のため、CryptoApi キー ハンドルはスレッド セーフではありません。
ほとんどのアルゴリズムとモードでは、暗号化されたのと同じ順序でデータを復号化する必要があります。マルチスレッド環境では、クリティカル セクションを使用しても順序付けの問題が解決されないため、これは難しい作業です。ECB 暗号モードでブロック暗号 (つまり、RC2、DES、または 3DES) を使用している場合、内部キーの状態は変化しないため、この問題は問題になりません。ただし、ECB はデフォルトの暗号モードではありません。CBC はデフォルトの暗号モードです。CBC 暗号モードでは、内部キーの状態が変化します。
結局のところ、複数のスレッドが同じキーを共有していなければ、実際に複数のスレッドで使用できると考えるのが合理的に思えます。CryptEncrypt
ただし、これは単なる推測です。
関数は共有アドレス空間を使用するため、同時に複数のプロセスをフォークして使用できないことを意味すると思います。すべてのスレッドのメモリにアクセスできるため、予期しない結果が生じる可能性があります。これは、アプリケーションがマルチスレッドを実行している場合にのみ、マルチスレッドの問題になるはずです。