gpt4 book ai didi

c# - 使用 C#/CSP 在 HSM 中使用不可导出 key 的 RSA 加密

转载 作者:太空狗 更新时间:2023-10-29 19:44:15 24 4
gpt4 key购买 nike

我正在尝试使用这段代码在 C# 中使用 RSA(CSP 中的交换 key )加密对称 key (RSA key 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# 正在尝试导出 key 以继续操作。下面的 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 正在尝试提取私钥(这意味着错误,因为该 key 不可导出)。

当我在 HSM 中使用可导出 key 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 key 导入/导出操作(引用:CSP50C8C7CE - 可导出 key )。

问题: System.Cryptography 库中的 Encrypt 函数是否需要 key 必须始终可导出?或者我在我的程序中犯了任何错误?是否遗漏了任何参数?

最佳答案

您不能使用 HSM 中的不可导出 key 在内存中进行加密或解密。由于您尝试在内存中进行加密,.NET 正在尝试将私钥提取到内存中,但 HSM 阻止了它。另一方面,您可以获得私钥的句柄并将您的“要加密/解密的数据”发送到 HSM。换句话说,您可以通过指定其句柄告诉 HSM 使用它包含的私钥对您的数据进行加密。

您的 HSM 应该为您提供一个实现 PKCS11 标准并且通常用 C 编写的 API。您可以从这个非托管库中提取方法并在 C# 中使用它们。 Here您可以找到用 C# 编写的 PKCS11 包装器库。

关于c# - 使用 C#/CSP 在 HSM 中使用不可导出 key 的 RSA 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com