CryptImportKey не работает в Windows 8
Используя 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;
}
1 ответ
Существует ошибка, как описано здесь. Ключи, экспортированные из Windows 7, не могут быть импортированы в Windows 8.1.
Этот пост в блоге описывает обходной путь. В OPAQUEKEYBLOB установите DWORD со смещением 0x14 в ноль:
*(DWORD *)(lpBlob + 0x14) = 0; // Set the packed key length to zero
Это позволяет импортировать ключ Windows 7 в Windows 8.1.