Я создал сборку C #, которая выполняет шифрование / шифрование 3DES, и протестировал ее. Теперь мне нужно расшифровать данные на удаленной машине для установки. Не гарантируется, что .NET будет присутствовать при запуске моего собственного процесса, поэтому мне нужно расшифровать его, используя методы Win32 C ++. Это для коммерческого применения, поэтому сторонние библиотеки должны будут гибко подходить к лицензированию. Я бы предпочел простой пример, чтобы начать меня. Большинство примеров, которые я нашел до сих пор, требуют импорта сеансовых ключей. Я не использую их. Я зашифровываю на машине A с помощью .NET 2.0 и перехожу на машину B, где я получу ключ и расшифрую его с помощью собственного API-интерфейса Win32. Кто-нибудь может указать мне правильное направление с некоторыми примерами?
Я знаю, мне нужно начать с CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT)
,
Однако следующим шагом является ключ импорта, и похоже, что он требует (http://support.microsoft.com/kb/228786). Это правильно, или я делаю это слишком сложно. У меня есть базовое понимание шифрования. Заранее спасибо!
Посмотрите на следующий код:
#define TRIPLEDES_KEYSIZE 24
#define TRIPLEDES_BLOCKSIZE 8
...
BYTE key[TRIPLEDES_KEYSIZE] = { ... };
...
HCRYPTKEY hKey;
typedef struct
{
BLOBHEADER hdr;
DWORD cbKeySize;
BYTE rgbKeyData [TRIPLEDES_KEYSIZE];
} KEYBLOB;
KEYBLOB keyBlob;
memset(&keyBlob, 0, sizeof(keyBlob));
keyBlob.cbKeySize = TRIPLEDES_KEYSIZE;
keyBlob.hdr.bType = PLAINTEXTKEYBLOB;
keyBlob.hdr.bVersion = CUR_BLOB_VERSION;
keyBlob.hdr.aiKeyAlg = CALG_3DES;
memcpy(keyBlob.rgbKeyData, key, TRIPLEDES_KEYSIZE);
BOOL res = CryptImportKey(hCryptProv, (const BYTE*)&keyBlob, sizeof(keyBlob), 0, 0, &hKey);
if (res)
{
res = CryptSetKeyParam(hKey, KP_MODE, CRYPT_MODE_ECB, 0);
Обратите внимание, что вы можете использовать CRYPT_MODE_ECB
или же CRYPT_MODE_CBC
в вызове функции CryptSetKeyParam
с KP_MODE
вариант в зависимости от того, что вы хотите сделать. Вы можете установить IV, например, с помощью следующего кода
res = CryptSetKeyParam(hKey, KP_IV, iv, 0);
что имеет смысл только в CRYPT_MODE_CBC
нравится режим.
Обратите внимание, что есть также другой режим 3DES (CALG_3DES_112
) работа только с 112-битным ключом (то есть с двумя обычными ключами DES). Вы должны изменить код, если вы хотите использовать этот режим.
Редактировать:
Вы должны написать несколько классов на C ++, чтобы управлять всеми вещами CryptoApi. Это избавит вас от головной боли.
Других решений пока нет …