Как только вы попали в рутину вещей, CryptoAPI относительно прост в использовании. Проблема заключается в том, чтобы сделать это способом, совместимым с другими библиотеками криптографии (включая .NET Framework). Я успешно сделал это раньше, но это было какое-то время; Основным камнем преткновения является выяснение того, как преобразовать простой текстовый ключ в формат, используемый с CryptoAPI (который работает с «ключевыми объектами»). К счастью, Microsoft предоставила нам рабочий, хотя и утомительный пример . Что касается способа работы с CryptoAPI, вот пример:
// 1. acquire a provider context.
// the Microsoft Enhanced provider offers the Triple DES algorithm.
HCRYPTPROV hProv = NULL;
if(CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{
// 2. generate the key; see Microsoft KB link above on how to do this.
HKEY hKey = NULL;
if(ImportPlainTextSessionKey(hProv, lpKeyData, cbKeyData, CALG_3DES, &hKey))
{
// 3. set the IV.
if(CryptSetKeyParam(hKey, KP_IV, lpIVData, 0))
{
// 4. read the encrypted data from the source file.
DWORD cbRead = 0;
while(ReadFile(hSourceFile, buffer, 8192, &cbRead, NULL) && cbRead)
{
// 5. decrypt the data (in-place).
BOOL bFinal = cbRead < 8192 ? TRUE : FALSE;
DWORD cbDecrypted = 0;
if(CryptDecrypt(hKey, NULL, bFinal, 0, buffer, &cbDecrypted))
{
// 6. write the decrypted data to the destination file.
DWORD cbWritten = 0;
WriteFile(hDestFile, buffer, cbDecrypted, &cbWritten, NULL);
}
}
}
CryptDestroyKey(hKey);
hKey = NULL;
}
CryptReleaseContext(hProv, 0);
hProv = NULL;
}