使用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;
}
答案 0 :(得分:0)
有described 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。