[英]C# 3DES encryption to C decryption
我創建了一個C#程序集,它進行3DES加密/加密並對其進行測試。 我現在需要在遠程計算機上解密數據以進行安裝。 當我的本機進程運行時,不保證.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 )。 這是正確的,還是我讓這個太難了。 我對加密有基本的了解。 提前致謝!
看看以下代碼:
#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);
請注意,您可以在使用KP_MODE
選項調用CryptSetKeyParam
函數時使用CRYPT_MODE_ECB
或CRYPT_MODE_CBC
,具體取決於您要執行的操作。 您可以通過以下代碼設置IV
res = CryptSetKeyParam(hKey, KP_IV, iv, 0);
這在CRYPT_MODE_CBC
類的模式下才有意義。
請注意,還有一個不同的3DES模式( CALG_3DES_112
)僅使用112位密鑰(即使用兩個普通DES密鑰)。 如果要使用此模式,則必須修改代碼。
編輯:
您應該用C ++編寫一些類來管理CryptoApi的所有內容。 它會為你省去很多麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.