簡體   English   中英

使用C#/ CSP在HSM中使用不可導出的密鑰進行RSA加密

[英]RSA Encryption with non exportable key in HSM using C# / CSP

我正在嘗試使用這段代碼(RSA密鑰CSP50C8C7CD無法導出,並且在HSM中)用C#中的RSA(CSP中的交換密鑰)用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.

Windows SO正在調用CryptExportKey,傳遞PRIVATEKEYBLOB的方式是導出私鑰。

LOG HSM

...
2012/12/12 17:44:02 [4DD18140] new key 'test/CSP50C8C7CD', t: 6, a: 0
2012/12/12 17:44:14 [4DC2A1C0] 'test' auth ok, 10.0.87.19
2012/12/12 17:44:17 [4DC2A1C0] 'test/CSP50C8C7CD' not exportable, conn: 9  --- ERROR

在HSM中,此日志表明Windows SO正在嘗試提取私鑰(這意味着ERRO,因為密鑰不可導出)。

當我在HSM中使用可導出密鑰CSP50C8C7CE時,日志顯示一切正常:

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中的Encrypt函數需要密鑰必須始終可導出嗎? 還是我的程序有任何錯誤? 可能有任何遺漏的參數嗎?

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

您的HSM應該為您提供一個實現PKCS11標准的API,該API通常是用C編寫的。您可以從此非托管庫中提取方法,並在C#中使用它們。 在這里,您可以找到用C#編寫的PKCS11包裝器庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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