2012-12-03 120 views
0

我已經創建了一個C#程序集,可以進行3DES加密/加密並對其進行測試。我現在需要解密遠程計算機上的數據以進行安裝。當我的本機進程運行時,.NET不能保證存在,所以我需要使用Win32 C++方法對它進行解密。這是爲了商業應用,所以第三方庫需要靈活地獲得許可。我寧願一個簡單的例子讓我開始。到目前爲止,我發現的大多數例子都需要導入會話密鑰。我沒有使用這些。我使用.NET 2.0對machineA進行加密,然後傳遞給machineB,在那裏我將檢索密鑰並使用原生Win32 API進行解密。任何人都可以用一些例子指出我的方向嗎?C#3DES加密到C解密

我知道我需要從CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT)開始。 但是,下一步似乎是導入密鑰,看起來它需要(http://support.microsoft.com/kb/228786)。這是正確的,還是我讓這太難了?我對加密有一個基本的瞭解。提前致謝!

+1

當你說「到MachineB,我將檢索密鑰和解密...」你已經有明文密鑰,並且正在尋找將它導入到密碼上下文來執行你的解密? (我假設你已經熟悉分組密碼加密模式(CBC,ECB等)。 – WhozCraig

+0

爲什麼不簡單地找到一個LGPL C++ 3DES並將其包裝爲C#,使用原始C++作爲遠程機器? – Martheen

+1

@Martheen因爲C#*有一個完整的[加密安全命名空間](http://msdn.microsoft.com/en-us/library/system.security.cryptography.aspx)。爲什麼當你帶入第三個輪子不需要,3DES是3DES,只要你符合正確的密鑰設置,塊模式和填充模式,System.Security.Cryptography將通過WinCrypt完成OP和C++的任務,他只需要獲取他的密鑰設置正確(這通常是在Windows上處理Crypto最難的部分) – WhozCraig

回答

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的功能CryptSetKeyParamKP_MODE選項取決於你想要做什麼。可以通過例如設定一個IV以下代碼

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

這使得僅感在CRYPT_MODE_CBC像模式。

請注意,還有一個不同的3DES模式(CALG_3DES_112)只能使用112位密鑰(即使用兩個正常的DES密鑰)。如果您想使用此模式,您必須修改代碼。

編輯:

你應該用C寫一些類++管理的CryptoAPI的所有東西。它會爲你節省很多頭痛。

+0

如果他只想用裸3DES密鑰解密一些數據,他應該可以在沒有yacppwc的情況下進行解密(又一個C++包裝類)這裏的API代碼看起來是正確的,你花時間提到他需要知道他是否在CBC模式等,並可能需要設置IV參數。你甚至提到了2鍵,這比大多數人想象的更多,所以+1。 – WhozCraig

+0

謝謝Fermat2357,這正是我期待讓我開始的東西!我會運行一些測試並在必要時發佈。謝謝一堆! – siasil