【问题标题】:ECDSA keys storingECDSA 密钥存储
【发布时间】:2016-09-29 13:36:29
【问题描述】:

我正在 .NET 中实现 ECDSA 密钥和证书,我需要存储这些密钥,以便我可以通过新的签名重用它们。 对于 RSA,我使用的是 RSACryptoServiceProvider 类,但我没有看到任何与 ECDsa 和 ECDsaCng 类相似的东西。

我只见过 DSACryptoServiceProvider 和一个旧的 ECDsaCryptoServiceProvider 到 Framework 4.3(有点旧)。

请问有人知道像 RSA 一样存储 ECDSA 密钥的方法吗?

【问题讨论】:

    标签: .net encoding cryptography ecdsa key-pair


    【解决方案1】:

    假设您的意思是您希望将密钥持久保存到操作系统密钥存储区(使用命名密钥的 RSACryptoServiceProvider),使用 CNG 的接口会有所不同:

    private static ECDsa CreateOrOpenECDsaKey(string keyName)
    {
        CngKey key;
    
        if (CngKey.Exists(keyName))
        {
            key = CngKey.Open(keyName);
        }
        else
        {
            // You can also specify options here, like if it should be exportable, in a
            // different overload.
            key = CngKey.Create(CngAlgorithm.ECDsaP521, keyName);
        }
    
        // The ECDsaCng constructor will duplicate the key reference, so we can close this one.
        using (key)
        {
            return new ECDsaCng(key);
        }
    }
    

    如果您想像 RSAParameters 那样进行导出/导入,则该功能在 .NET Core 中提供,但在 .NET Framework 中尚不提供。

    【讨论】:

    • 谢谢你的回答,真的很有用。我已经尝试过,但在作为 ECDsaCng 值的返回中出现异常:“与 ECDsaCng 算法一起使用的密钥必须具有 ECDsa 算法组。\r\n参数名称:密钥”。我的密钥是用 BouncyCastle 库生成的,它似乎是作为 ECDH 而不是 ECDSA 创建的。我必须在这边找出来。
    • @santiPipes 已修复 .NET Framework 4.6.2 (referencesource.microsoft.com/#System.Core/System/Security/…)
    • 我明白了,非常感谢@bartonjs。这意味着我必须在要执行该软件的所有计算机上安装新框架,不是吗?我想这并不能解决仅使用 Framework 4.6.2 编译(我知道,愚蠢的问题)
    • @santiPipes 如果您的密钥是使用 BouncyCastle 创建的,那么是的 :(。如果您让 CngKey.Create 创建密钥,那么它将适用于 .NET 3.5 或更高版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多