Все функции CryptoAPI живут в advapi32.dll
== Шифрование данных ==
1. Создадим CryptoContext (т.е. зададим сборник алгоритмов шифрования):
CryptAcquireContext( &hCryptProv,
NULL,
MS_ENHANCED_PROV,
PROV_RSA_FULL,
0)
2. Создадим ключ на основе пароля (если быть точным, то на основе хеша пароля).
2а. Создаём контекст для вычисления хеша:
CryptCreateHash( hCryptProv,
CALG_MD5,
0,
0,
&hHash)
2б. Вычисляем хэш от пароля:
CryptHashData( hHash,
(BYTE *)pszPassword,
strlen(pszPassword),
0)
2в. Получаем ключ:
CryptDeriveKey( hCryptProv,
ENCRYPT_ALGORITHM,
hHash,
KEYLENGTH,
&hKey)
Алгоритм | Константа | Значение | Размер блока | Размер ключа |
DES | CALG_DES | 0x00006601 | 64 | 56 |
Triple DES с двумя ключами | CALG_3DES_112 | 0x00006609 | 64 | 112 |
Triple DES | CALG_3DES | 0x00006603 | 64 | 128 |
RC2 | CALG_RC2 | 0x00006602 | 64 | 128 |
а KEYLENGTH - это размер ключа, сдвинутый влево на 16.
3. Поблочно шифруем данные:
CryptEncrypt( hKey,
NULL,
fEOF,
0,
pbBuffer,
&dwCount,
dwBufferLen)
4. Убираем за собой:
CryptDestroyHash(hHash); CryptDestroyKey(hKey); CryptReleaseContext(hCryptProv, 0);
== Дешифровка данных ==
Всё то же самое, только на третьем шаге вызывается функция
CryptDecrypt( hKey,
0,
fEOF,
0,
pbBuffer,
&dwCount)
== Прототипы использованных функций ==
WINADVAPI
BOOL
WINAPI
CryptAcquireContextA(
HCRYPTPROV *phProv,
LPCSTR szContainer,
LPCSTR szProvider,
DWORD dwProvType,
DWORD dwFlags
);
WINADVAPI
BOOL
WINAPI
CryptCreateHash(
__in HCRYPTPROV hProv,
__in ALG_ID Algid,
__in HCRYPTKEY hKey,
__in DWORD dwFlags,
__out HCRYPTHASH *phHash
);
WINADVAPI
BOOL
WINAPI
CryptHashData(
__in HCRYPTHASH hHash,
__in_bcount(dwDataLen) CONST BYTE *pbData,
__in DWORD dwDataLen,
__in DWORD dwFlags
);
WINADVAPI
BOOL
WINAPI
CryptDeriveKey(
__in HCRYPTPROV hProv,
__in ALG_ID Algid,
__in HCRYPTHASH hBaseData,
__in DWORD dwFlags,
__out HCRYPTKEY *phKey
);
WINADVAPI
__success(0 < return) BOOL
WINAPI
CryptEncrypt(
__in HCRYPTKEY hKey,
__in HCRYPTHASH hHash,
__in BOOL Final,
__in DWORD dwFlags,
__inout_bcount_part(dwBufLen, *pdwDataLen) BYTE *pbData,
__out DWORD *pdwDataLen,
__in DWORD dwBufLen
);
WINADVAPI
BOOL
WINAPI
CryptDecrypt(
__in HCRYPTKEY hKey,
__in HCRYPTHASH hHash,
__in BOOL Final,
__in DWORD dwFlags,
__inout_bcount_part(*pdwDataLen, *pdwDataLen) BYTE *pbData,
__deref_inout DWORD *pdwDataLen
);
WINADVAPIBOOL
WINAPI
CryptDestroyHash(
__in HCRYPTHASH hHash
);
WINADVAPI
BOOL
WINAPI
CryptDestroyKey(
__in HCRYPTKEY hKey
);
WINADVAPI
BOOL
WINAPI
CryptReleaseContext(
__in HCRYPTPROV hProv,
__in DWORD dwFlags
);
------------ Дoбавленo в 00.29:
Рассмотренные выше алгоритмы - симметричные. С асимметричными (RSA) пляска на порядок сложнее, и в концепцию компонента CRYPT уже не укладывается.