0

我创建了一个执行 3DES 加密/加密的 C# 程序集并对其进行了测试。我现在需要解密远程机器上的数据以进行安装。当我的本机进程运行时,不保证存在 .NET,因此我需要使用 Win32 C++ 方法对其进行解密。这是针对商业应用程序的,因此第三方库需要灵活地使用许可。我更喜欢一个简单的例子来让我开始。到目前为止,我发现的大多数示例都需要导入会话密钥。我不使用那些。我正在使用 .NET 2.0 在 machineA 上加密,然后传递给 machineB,在那里我将检索密钥并使用本机 Win32 API 解密。谁能用一些例子指出我正确的方向?

我知道我需要从CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT). 但是,下一步似乎是导入密钥,它看起来需要 ( http://support.microsoft.com/kb/228786 )。这是正确的,还是我让这太难了。我对加密有一个基本的了解。提前致谢!

4

1 回答 1

2

看看下面的代码:

#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_ECBCRYPT_MODE_CBC调用CryptSetKeyParam带有KP_MODE选项的函数,具体取决于您要执行的操作。您可以通过例如以下代码设置 IV

res = CryptSetKeyParam(hKey, KP_IV, iv, 0);

CRYPT_MODE_CBC这仅在类似模式下才有意义。

请注意,还有一种不同的 3DES 模式 ( CALG_3DES_112) 仅使用 112 位密钥(即使用两个普通 DES 密钥)。如果要使用此模式,则必须修改代码。

编辑:

You should write some classes in C++ to manage all things of the CryptoApi. It will save you a lot of headache.

于 2012-12-03T07:52:46.370 回答