簡體   English   中英

如何為ECDiffieHellmanCng導出私鑰

[英]How to Export Private Key For ECDiffieHellmanCng

我正在嘗試從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對象的實例?

默認情況下,密鑰不可導出 - 它們安全地存儲在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.Import(yourBlob, CngKeyBlobFormat.EccPrivateBlob)並將其傳遞給ECDiffieHellmanCng的構造函數。


SecuritySafeCriticalAttribute是.NET安全透明度模型的一部分 它不是您錯誤的來源。

我相信你指定了錯誤的BLOB格式。 嘗試:

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

如果失敗,則需要設置允許私鑰導出的密鑰策略。 有關您的問題的詳細信息,請參閱此答案: https//stackoverflow.com/a/10274270/2420979

暫無
暫無

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

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