2012-03-20 12 views
3

Microsoft CryptoAPIを使用してSHA-1を計算し、Windows 7、Windows Server 2008、Windows Server 2003で動作するコンパイル済みexeを取得しました。私はWindows XP SP3の下でそれを実行すると、動作しません。MS CryptoAPIがCryptAcquireContext()でWindows XPで動作しない

私はCryptAcquireContext()コールの失敗を絞りました。

私はa previous postは「(プロトタイプ)... 」のXP不良の命名について話しました、それはWinXPの特定のマクロMS_ENH_RSA_AES_PROV_XPを使用して考慮しなければならないという通知をしました。

私はXP固有のコードの変更を行いましたが、それでも動作しません。 (bResult戻りウィンXP上の0偽、真の1を返しbResult他のすべてのプラットフォーム。)

は、私はすべてのものは、動作するようにセットアップされたように見えるので、私はregedit.exeをで見る実際のキー+文字列値でMS_ENH_RSA_AES_PROV_XPを確認したが失敗。

私はWindows XP上で動作させるために何か見落としましたか?

問題を説明するためにできるだけ短い例を貼り付けました。 VS2010 C++を使用しました。

// based on examples from http://msdn.microsoft.com/en-us/library/ms867086.aspx 

#include "windows.h" 
#include "wincrypt.h" 
#include <iostream> 
#include <iomanip> // for setw() 

void main() 
{ 
    BOOL bResult; 
    HCRYPTPROV hProv; 

    // Attempt to acquire a handle to the default key container. 
    bResult = CryptAcquireContext(
     &hProv,   // Variable to hold returned handle. 
     NULL,    // Use default key container. 
     MS_DEF_PROV,  // Use default CSP. 
     PROV_RSA_FULL,  // Type of provider to acquire. 
     0);    // No special action. 
    std::cout << "line: " << std::setw(4) << __LINE__ << "; " << "bResult = " << bResult << std::endl; 

    if (! bResult) {  // try Windows XP provider name 
     bResult = CryptAcquireContext(
      &hProv,   // Variable to hold returned handle. 
      NULL,    // Use default key container. 
      MS_ENH_RSA_AES_PROV_XP, // Windows XP specific instead of using default CSP. 
      PROV_RSA_AES,  // Type of provider to acquire. 
      0);    // No special action. 
     std::cout << "line: " << std::setw(4) << __LINE__ << "; " << "bResult = " << bResult << std::endl; 
    } 

    if (bResult) 
     CryptReleaseContext(hProv, 0); 
} 

Windows 7の成功: enter image description here

のWindows XPの失敗:あなたのCryptAcquireContextコードで enter image description here

答えて

5

、あなたが特定のコンテナを設定せずにコンテキストを取得するには、パラメータが欠落している表示されます。 CryptAcquireContextでCRYPT_VERIFYCONTEXTオプションを渡す必要があります。

Windows 7がこの問題を回避している可能性があります。さらに、診断用

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx

、のGetLastError()の結果は必要であろう。

+0

はい、うまくいきました!ありがとうございました。コードをコピーしたMicrosoftのオンラインサンプルは、そのパラメータを持っていませんでした。しかし、混乱に加えて、MS_ENH_RSA_AES_PROV_XPを使用しない最初の呼び出しにCRYPT_VERIFYCONTEXTを追加すると、XPでも動作します!不思議ですが、私はそれを取るでしょう。 – JasDev