【问题标题】:How to Export Private Key For ECDiffieHellmanCng如何为 ECDiffieHellmanCng 导出私钥
【发布时间】:2013-12-13 21:26:41
【问题描述】:

我正在尝试从 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 对象的实例?

【问题讨论】:

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


    【解决方案1】:

    默认情况下,密钥不可导出 - 它们安全地存储在 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 的一部分。这不是你错误的根源。

    【讨论】:

    • 当我调试解决方案时,ExportPolicy 设置为 None,根据文档 msdn.microsoft.com/en-us/library/…,这应该可以让我不受限制地访问导出。像您在示例中所做的那样专门设置导出策略就可以了。我想这不是 MSDN 文档第一次出错了。
    • @KevinJunghans 有趣 - 我在文档页面上留下了评论,希望它会得到调查和纠正。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      相关资源
      最近更新 更多