C# ecdsa 签名 - 我可以选择哪个密钥规范?

Posted

技术标签:

【中文标题】C# ecdsa 签名 - 我可以选择哪个密钥规范?【英文标题】:C# ecdsa signature - Which key specification can i choose? 【发布时间】:2013-10-19 14:05:15 【问题描述】:

我需要在 C# 端生成 ECDSA 签名,并在使用(显然)相关公钥读取并验证 android 应用程序上的签名后。 好吧,要在 java 中获取 ECDSA 密钥对(带有充气城堡提供程序),代码是这样的

kpg = KeyPairGenerator.getInstance("ECDSA", "BC");
            ecSpec = new ECGenParameterSpec("secp224k1");
kpg.initialize(ecSpec, new SecureRandom());

字符串"secp224k1",是曲线名称。我可以选择“secp224k1”、“secp224r1”、“secp256k1”、“secp256r1”等等。

我的问题是:

    上面提到的 C# 中的等效曲线名称是什么? 谁能给我举个例子,说明如何在 C# 中生成与上述 java 代码类似的 keyPair?

提前致谢

【问题讨论】:

【参考方案1】:

我发现了关于我的第一个问题的一些信息:

上面提到的C#中的等效曲线名称是什么?

microsoft 库仅支持 P-256、P-384 和 P-521“NIST 推荐的椭圆曲线 ID”,即等效命名曲线,分别为“SEC 2 推荐椭圆曲线域”的 secp256r1、secp384r1、secp521r1参数”相当于 prime256v1,但不是 ANSI X9.62 ECDSA 素数曲线 ID 中的 384 和 521。 C# 的充气城堡库,支持更多其他曲线,例如我感兴趣的 secp224k1。

第二个问题

谁能给我举个例子,在 C# 中,我可以像上面的 java 代码那样生成一个 keyPair 吗?

我找到了一个老例子 here 它说支持的密钥只有 3:192 位、239 位和 256 位,但我认为是指一些旧版本的库

这段代码可以演示一下

ECKeyPairGenerator gen = new ECKeyPairGenerator("ECDSA");
        SecureRandom secureRandom = new SecureRandom();
        Org.BouncyCastle.Asn1.X9.X9ECParameters ecp = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp224k1");
        ECDomainParameters ecSpec = new ECDomainParameters(ecp.Curve, ecp.G, ecp.N, ecp.H, ecp.GetSeed());
        ECKeyGenerationParameters ecgp = new ECKeyGenerationParameters(ecSpec, secureRandom);
        gen.Init(ecgp);
        AsymmetricCipherKeyPair eckp = gen.GenerateKeyPair();

如果有人想让它变得更好,我认为这个线程对所有人来说都是非常宝贵的。我只是 C# 的初学者,这段代码不是我的。 :)

【讨论】:

以上是关于C# ecdsa 签名 - 我可以选择哪个密钥规范?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NodeJS 中生成 ECDSA 签名而不需要 PEM 密钥格式?

Java - 使用 ECDSA(椭圆曲线)创建 XML 数字签名

如何使用 C#.NET 的 PEM 文件中的 P-256 密钥计算 ECDSA 签名?

C#下ECDsa签名验签

如何在 C# 中加载私有 ecdsa 密钥 es256?

如何将 OpenSSL ECDSA 密钥加载到 C# 中?