BCryptDecrypt
エラーを返す関数を呼び出しています。エラー 120 が表示getlasterror
されます。これは、この機能がこのシステム (msdn) でサポートされていないことを意味します。
status = BCryptDecrypt( hKey, pbInput, cbInput, NULL, NULL, sizeof(DWORD), NULL, 0, &pcbResult, BCRYPT_BLOCK_PADDING);
pbInput
は復号化するデータを含むアドレスへのポインタcbInput
で、ファイルの長さでpcbResult
あり、出力ファイル (復号化されたデータ) のサイズを取得します。BCryptEncrypt
正常に動作していますが、動作していBCryptDecryptis
ません。
誰でも私を助けてもらえますか?復号化に関連する数行のコード:
status = BCryptOpenAlgorithmProvider(&hAlgorithm , BCRYPT_AES_ALGORITHM , NULL , 0); if (!NT_SUCCESS(status)) { return; }
DWORD cbKey = 0;
DWORD cbData =0;
status = BCryptSetProperty(hAlgorithm , BCRYPT_CHAINING_MODE , (PBYTE)BCRYPT_CHAIN_MODE_ECB , sizeof(BCRYPT_CHAIN_MODE_ECB) , 0);
if (!NT_SUCCESS(status))
{
return;
}
status = BCryptGetProperty(hAlgorithm,
BCRYPT_OBJECT_LENGTH,
(LPBYTE)&cbData,
sizeof(DWORD),
&cbKey,
0);
LPBYTE pbKey = (BYTE*)HeapAlloc(GetProcessHeap() , 0 , cbData);
LPCSTR szpwd = (LPCSTR)Getpwd();
BCRYPT_KEY_HANDLE hKey = NULL;
status = BCryptGenerateSymmetricKey(hAlgorithm,
&hKey,
pbKey,
cbData,
(PUCHAR)szpwd,
(ULONG)strlen(szpwd),
0);
if (!NT_SUCCESS(status))
{
if(hAlgorithm)
{
BCryptCloseAlgorithmProvider(hAlgorithm,0);
}
if(pbKey)
{
HeapFree(GetProcessHeap(), 0, pbKey);
}
return;
}
DWORD pcbResult = 0;
status = BCryptDecrypt( hKey,
pbInput,
cbInput,
NULL,
NULL,
sizeof(DWORD),
NULL,
0,
&pcbResult,
BCRYPT_BLOCK_PADDING);
DWORD cbError = GetLastError();
if(cbError != 0)
{
LPCSTR messageBuffer = NULL;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, cbError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);