我正在尝试使用这段代码在 C# 中使用 RSA(CSP 中的交换密钥)加密对称密钥(RSA 密钥 CSP50C8C7CD 不可导出,它在 HSM 中):
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 函数需要密钥必须始终可导出?或者我在我的程序中犯了任何错误?可能有任何遗漏的参数吗?