我試圖用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中的加密函數需要密鑰必須始終可導出?或者我在我的程序中犯了什麼錯誤?任何遺漏的參數可能?
這個想法是在HSM上使用加密並使用CSP來完成。該守則的目的不會在內存中進行加密。 HSM提供了一個CSP驅動程序,用於實現此類Microsoft的特定API。 函數** rsa_dnet.Encrypt(tripleDES.Key,false)**不應該嘗試提取私鑰,因爲啓用了標誌CspProviderFlags.UseNonExportableKey。 – Vasconcelos