簡體   English   中英

C#3DES加密到C解密

[英]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_ECBCRYPT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM