C#3DES加密到C解密

C#3DES加密到C解密,c#,c++,winapi,encryption,C#,C++,Winapi,Encryption,我创建了一个执行3DES加密/加密的C#程序集,并对其进行了测试。我现在需要解密远程计算机上的数据以进行安装。当我的本地进程运行时,网络不能保证存在,所以我需要使用Win32 C++方法对其进行解密。这是一个商业应用程序,所以第三方图书馆需要灵活的许可。我更喜欢一个简单的例子来开始。到目前为止,我发现的大多数示例都需要导入会话密钥。我没有用那些。我正在使用.NET 2.0在machineA上加密,并传递到machineB,在那里我将检索密钥并使用本机Win32 API进行解密。有人能举几个例子给

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

我知道我需要从
CryptAcquireContext(&hProv,NULL,MS\u-ENHANCED\u-PROV,PROV\u-RSA\u-FULL,CRYPT\u-VERIFY\u-CONTEXT)
开始。
但是,下一步似乎是导入密钥,它似乎需要()。这是正确的,还是我把它弄得太难了。我对加密有基本的了解。提前谢谢

请查看以下代码:

#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\u模式\u CBC
like模式下才有意义

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

编辑:


您应该用C++编写一些类来管理加密API的所有内容。这将为您省去很多麻烦。

当您说“到MachineB,我将在那里检索密钥并解密…”时,您是否已经拥有明文密钥,并希望将其导入加密上下文以执行解密?(我假设您已经熟悉分组密码加密模式(CBC、ECB等)为什么不简单地在那里找到一个LGPL C++ 3DES,并将它封装到C++中,使用原始C++来远程机器?@ Martheen,因为C语言已经满了。为什么不必带第三轮?3DES是3DES,只要符合适当的密钥设置、块模式和填充模式。Soal.SoopITI.Type将像Oc++那样实现OP所需的。他只需要正确地设置他的密钥(通常是处理Windows上的密码的最困难的部分)。如果他想做的就是用裸露的3DES密钥解密一些数据,那么他就可以在没有YACPPWC的情况下完成它(而另一个C++包装类)。。这里的API代码看起来是正确的,你花时间提到他需要知道他是否处于CBC模式,等等,并且可能需要设置IV参数。你甚至提到了2-key,这比大多数人想象的要多,所以+1。谢谢你Fermat2357,这正是我想要开始的!如果n必要的。非常感谢!