如何为ECDiffieHellmanCng导出私钥

时间:2013-12-10 21:11:36

标签: c# security public-key-encryption diffie-hellman cng

我正在尝试从 ECDiffieHellmanCng 对象的新实例导出密钥,以便稍后可以使用相同的密钥创建它的实例。但是在尝试导出时我遇到了错误。

//Create new ECDiffieHellmanCng which automatically creates new keys
var ecdh = new ECDiffieHellmanCng();
//Export the keys
var privateKey = ecdh.Key.Export(CngKeyBlobFormat.EccPrivateBlob);

当我使用消息“ 不支持请求的操作 ”调用 Export 方法时,我收到了CryptographicException。代码中的断点看起来它甚至在执行方法之前抛出了异常。查看Export方法的定义,它使用 SecuritySafeCriticalAttribute 进行装饰,因此我怀疑此属性实际上是在抛出异常。导致此异常的原因是什么?如何保存密钥以便以后可以创建同一个ECDiffieHellmanCng对象的实例?

2 个答案:

答案 0 :(得分:11)

默认情况下,密钥不可导出 - 它们安全地存储在KSP中。创建密钥时,需要将其标记为允许导出。例如:

var ecdh = new ECDiffieHellmanCng(CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null, new CngKeyCreationParameters {ExportPolicy = CngExportPolicies.AllowPlaintextExport}));
//Export the keys
var privateKey = ecdh.Key.Export(CngKeyBlobFormat.EccPrivateBlob);

为了简化这一点,我们可以直接从CngKey导出它,如果您只想创建一个新密钥并导出私钥,则不要使用该算法。

var cngKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null, new CngKeyCreationParameters {ExportPolicy = CngExportPolicies.AllowPlaintextExport});
var privateKey = cngKey.Export(CngKeyBlobFormat.EccPrivateBlob);

您可以使用CngKey.Import(yourBlob, CngKeyBlobFormat.EccPrivateBlob)从导出的blob重新创建CngKey,并将其传递给ECDiffieHellmanCng的构造函数。


SecuritySafeCriticalAttribute是.NET Security Transparency model的一部分。它不是您错误的来源。

答案 1 :(得分:1)

我相信您指定了错误的BLOB格式。尝试:

var privateKey = ecdh.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);

如果失败,您需要设置允许私钥导出的密钥策略。有关您的问题的详细信息,请参阅此答案:https://stackoverflow.com/a/10274270/2420979