C # 3DES шифрование в C дешифрование

Я создал сборку 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). Это правильно, или я делаю это слишком сложно. У меня есть базовое понимание шифрования. Заранее спасибо!

0

Решение

Посмотрите на следующий код:

#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. Это избавит вас от головной боли.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector