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

时间:2013-10-19 14:05:15

标签: c# java android ecdsa

我需要在C#端生成ECDSA签名,并在使用(显然)相对公钥读取并验证Android应用程序上的签名。 好吧,要在java中获得ECDSA密钥对(使用充气城堡提供商),代码就像那样

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

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

我的问题是:

  1. 上面提到的C#中的等效曲线名称是什么?
  2. 有人能让我举一个例子,在C#中,我可以像上面的java代码一样生成keyPair吗?
  3. 提前致谢

1 个答案:

答案 0 :(得分:2)

我发现了第一个问题:

  

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

微软库仅支持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#的初学者,这个代码不是我的。 :)