[英]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.