0

Crypto32 Windows を使用するとCryptoImportKey、Windows 8.1 で関数が失敗し、ERROR_INVALID_PARAMETER が返されます。以前のすべてのバージョンの Windows で問題なく動作しました。

誰かがそれについてのヒントを持っていますか?

コードは次のとおりです。

if (!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0))
{
    dwResult = GetLastError();
    if (dwResult == NTE_BAD_KEYSET)
    {

        if (!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
        {
            dwResult = GetLastError();
            strAux.Format("Error [%x]: CryptAcquireContext() failed.",dwResult);
            AfxMessageBox(  strAux,  MB_OK);
            return;
        }
    } else {
        dwResult = GetLastError();
        strAux.Format("Error [0x%x]: CryptAcquireContext() SECOND failed.",dwResult);
        AfxMessageBox(  strAux,  MB_OK);
        return;
    }
}

if (pbBlob != NULL)
{  
    //Porto 02-07-2014
    *(DWORD *)(pbBlob + 0x14) = 0; // Set the packed key length to zero 

    if (!CryptImportKey(hProv, pbBlob, cbBlob, 0, 0, &hSessionKey))
    {
        dwResult = GetLastError();
        strAux.Format("Error [%x]: CryptImportKey() failed.Size: %d",dwResult,cbBlob);
        AfxMessageBox(  strAux,  MB_OK);
        return;
    }
} else { 
    if (!CryptImportKey(hProv, PrivateKeyWithExponentOfOne, sizeof(PrivateKeyWithExponentOfOne), 0, 0, &hKey))
    {
        strAux.Format("Error [%x]: CryptImportKey() PRIVATE failed.",dwResult);
        AfxMessageBox(  strAux,  MB_OK);
        return;
    }
4

1 に答える 1

0

here で説明されているバグがあります。Windows 7 からエクスポートされたキーは、Windows 8.1 にインポートできません。

そのブログ投稿では、回避策について説明しています。OPAQUEKEYBLOB で、オフセット 0x14 の DWORD をゼロに設定します。

*(DWORD *)(lpBlob + 0x14) = 0; // Set the packed key length to zero 

これにより、Windows 7 キーを Windows 8.1 にインポートできます。

于 2015-05-28T23:28:03.597 に答える