看看下面的代码:
#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 密钥)。如果要使用此模式,则必须修改代码。
编辑:
You should write some classes in C++ to manage all things of the CryptoApi. It will save you a lot of headache.