2012-12-19 28 views
8

我試圖用C#中的RSA(CSP中的Exchange密鑰)使用這段代碼加密對稱密鑰(RSA密鑰CSP50C8C7CD不可導出,並且它在HSM中):使用C#/ CSP在HSM中使用非導出密鑰加密RSA

CspParameters csp_dnet = new CspParameters(1, "HSM especific CSP"); 
csp_dnet.Flags = CspProviderFlags.UseNonExportableKey; 
csp_dnet.KeyContainerName = "test"; 

RSACryptoServiceProvider rsa_dnet = new RSACryptoServiceProvider(csp_dnet); 

// Create 3DES key 
TripleDES tripleDES = new TripleDESCryptoServiceProvider(); 

// Encrypt 3DES with RSA 
byte[] encryptedSessionKey = rsa_dnet.Encrypt(tripleDES.Key, false); 

看到CSP日誌,我注意到C#試圖導出密鑰以繼續操作。該CSP日誌下面只是顯示約rsa_dnet.Encrypt使用一塊:

LOG CSP 

... 

[12/12/2012 17:28:45] [3688] D [CryptExportKey] Blob type: PRIVATEKEYBLOB 

... 

[12/12/2012 17:28:45] [3688] E [CryptExportKey] Return: FALSE. An internal error occurred. 

窗口,以便被調用CryptExportKey傳遞PRIVATEKEYBLOB意味着取消導出私鑰。

​​

在HSM此日誌顯示,在Windows SO試圖提取私鑰(拿什麼ERRO因爲密鑰是不可導出)。

當我使用一個導出密鑰CSP50C8C7CE在HSM,日誌顯示,是一切都還好嗎:

LOG HSM 

... 

2012/12/12 17:47:46 [4DEF4040] 'test' auth ok, IP: 10.0.87.19 
2012/12/12 17:47:46 [4DEF4040] export: 'test/CSP50C8C7CE', 1462 
2012/12/12 17:47:46 [4DEF4040] export: 'test/CSP50C8C7CE', 1462 
2012/12/12 17:47:46 [4DEF4040] delete 'test/CSP50C8C7CE' 
2012/12/12 17:47:46 [4DEF4040] import obj 'test/CSP50C8C7CE', 00000004 
2012/12/12 17:47:46 [4DEF4040] pk test/CSP50C8C7CE [1] 
2012/12/12 17:47:46 [4DEF4040] import obj 'cf1c34c8be5d2fa8a4575c63dd903454', 00000003 
2012/12/12 17:47:46 [4DEF4040] delete 'test/CSP50C8C7CE' 
2012/12/12 17:47:46 [4DEF4040] import obj 'test/CSP50C8C7CE', 00000006 
2012/12/12 17:47:47 [4DEF4040] export: 'cf1c34c8be5d2fa8a4575c63dd903454', 24 
2012/12/12 17:47:47 [4DEF4040] delete 'cf1c34c8be5d2fa8a4575c63dd903454' 

注意,此日誌顯示大量的RSA密鑰導入/導出操作(參考文獻中的:CSP50C8C7CE - 可導出密鑰)。

問題:庫System.Cryptography中的加密函數需要密鑰必須始終可導出?或者我在我的程序中犯了什麼錯誤?任何遺漏的參數可能?

回答

3

您不能在HSM中使用非導出密鑰來加密或解密內存。由於您嘗試在內存中進行加密,因此.NET正試圖將私鑰提取到內存中,並且由HSM阻止。另一方面,您可以擁有私鑰的句柄,並將您的「要加密/解密的數據」發送給HSM。換句話說,您可以通過指定HSM的句柄來告訴HSM使用其包含的私鑰對數據進行加密。

您的HSM應該爲您提供一個實現PKCS11標準並且經常用C語言編寫的API。您可以從這個非託管庫中擴展方法並在C#中使用它們。 Here你可以找到用C#編寫的PKCS11包裝庫。

+0

這個想法是在HSM上使用加密並使用CSP來完成。該守則的目的不會在內存中進行加密。 HSM提供了一個CSP驅動程序,用於實現此類Microsoft的特定API。 函數** rsa_dnet.Encrypt(tripleDES.Key,false)**不應該嘗試提取私鑰,因爲啓用了標誌CspProviderFlags.UseNonExportableKey。 – Vasconcelos