Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从本地服务运行时,CryptProtectData在Windows XP上失败,出现NTE_BAD_密钥集(0x80090016)错误_C++_Windows_Winapi_Cryptoapi - Fatal编程技术网

C++ 从本地服务运行时,CryptProtectData在Windows XP上失败,出现NTE_BAD_密钥集(0x80090016)错误

C++ 从本地服务运行时,CryptProtectData在Windows XP上失败,出现NTE_BAD_密钥集(0x80090016)错误,c++,windows,winapi,cryptoapi,C++,Windows,Winapi,Cryptoapi,在保存到HKLM键之前,我正在本地服务中使用以下代码对一些敏感数据进行加密: LPCTSTR pStr = L"This is a plaintext string!"; DATA_BLOB blobIn; blobIn.pbData = (BYTE*)pStr; blobIn.cbData = lstrlen(pStr) * sizeof(TCHAR); DATA_BLOB blobOut = {0}; if(::CryptProtectData(&blobIn, NULL, N

在保存到
HKLM
键之前,我正在本地服务中使用以下代码对一些敏感数据进行加密:

LPCTSTR pStr = L"This is a plaintext string!";

DATA_BLOB blobIn;
blobIn.pbData = (BYTE*)pStr;
blobIn.cbData = lstrlen(pStr) * sizeof(TCHAR);

DATA_BLOB blobOut = {0};

if(::CryptProtectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut))
{
    //Success, use encrypted byte array from blobOut.pbData

    ::LocalFree(blobOut.pbData);
}
好的,这工作正常,除了在Windows XP上运行(从我的本地服务中)时。API失败,错误代码为NTE_BAD_KEYSET(0x80090016)


知道如何在那里工作吗?

错误
NTE\u BAD\u KEYSET
表示密钥不存在或者您没有访问它们的权限。我猜测(虽然不确定)问题与您试图从服务调用此函数有关,但未能指定
CRYPTPROTECT\u LOCAL\u MACHINE
标志。如果没有该标志,函数将尝试使用当前用户的密钥加密数据。但是没有“当前用户”,因为您是通过服务调用它的。@CodyGray:两处更正。1) 服务有一个当前用户帐户,它是
NT AUTHORITY\SYSTEM
,具有SID
s-1-5-18
和2)如果我使用
CRYPTPROTECT\u LOCAL\u MACHINE
标记它有点违背目的。。。那台电脑上的任何用户都可以解读数据。嗯,是的,你的#1是正确的。为了避免留下太长的评论,我稍微简化了一些。服务以LocalSystem帐户运行,除非您在服务安装程序中特别指定了其他帐户。问题是,LocalSystem帐户没有密码。因此,虽然我不是绝对肯定,但我猜这也可能意味着它没有可以与crypto API一起使用的密钥。@CodyGray:不,我不认为crypto API使用密码进行加密。否则,如果用户更改了它,加密就会中断。最肯定的是,它使用用户的SID。无论哪种情况,此方法都适用于Vista和更高版本。它只在Windows XP上失败。这就是我问的原因。