2010-11-17 73 views
2

我試圖將用Win32 Crypto API生成的RSA公鑰/私鑰對導入到.NET應用程序中。創建和導出密鑰對的代碼看起來是這樣的:如何將RSA私鑰導入RSACryptoServiceProvider?

// Abbreviated for clarity. 
CryptAcquireContext(..., MS_ENHANCED_PROV, ...); 

// Generate public/private key pair 

CryptCreateHash(..., CALG_SHA1, ...); 
CryptHashData(hash, password, ...); 
CryptDeriveKey(..., CALG_3DES, hash, CRYPT_EXPORTABLE, ...); 
CyrptExportKey(..., derivedKey, PRIVATEKEYBLOB, ...); 

基本上,這個代碼導出公共/私有密鑰對加密的blob。它使用3DES算法進行加密,並使用SHA-1哈希衍生的密鑰進行加密。

現在,當我嘗試將此密鑰導入到.NET中時,我遇到了問題。我嘗試過:

(1)我創建一個RSACyrptoServiceProvider對象並調用ImportCspBlob()。這會引發異常,並顯示消息「壞數據」。這並不奇怪,因爲提供者對象無法知道blob是如何加密的。據我所知,根本沒有辦法告訴它使用什麼算法和關鍵。 (2)我使用PasswordDeriveBytes類自己手動解密Blob,然後將解密後的Blob傳遞給ImportCsbBlob()。我再次遇到異常。這一次的消息是「提供商的糟糕版本」。我嘗試在創建提供程序對象時手動提供提供程序名稱(「Microsoft Enhanced Cryptographic Provider v1.0」),但它沒有區別。

重要的是我得到這個工作。有任何想法嗎?

SOLUTION

產生在C++和.NET未加密的公鑰/私鑰對之後,我發現了Microsoft增強加密提供程序實際上並不加密密鑰對的第一個8字節。 (這必須是爲循環引發.NET包裝的版本信息。)修改我的.NET解密代碼以保留前8個字節後,一切正常。

該解決方案不是很好,因爲它取決於加密提供程序的內部實現情況。不幸的是,我不認爲有任何其他方式,因爲微軟忽略提供一個版本的ImportCspBlob,讓您指定一個解密算法和密鑰。

回答

2

在方法2)中,驗證解密密鑰與加密前相同。

我不認爲「從SHA-1散列派生的密鑰」將匹配一個從PasswordDeriveBytes

+0

我敢肯定,密鑰導出工作,但我會看看我能不能比較兩個明文。 – 2010-11-17 19:50:13

+0

這讓我走上了正軌,謝謝。 – 2010-11-17 20:41:47