2013-10-19 21 views
2

我需要在C#端生成一个ECDSA签名,并且在使用(显然)相对公钥读取和验证Android应用程序的签名之后。 好了,让Java中的ECDSA密钥对(含充气城堡提供商),代码就是这样C#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吗?

在此先感谢

回答

2

我发现一些有关我的第一个问题:

这是上面提到的在C#中相当于曲线的名字吗?

Microsoft库仅支持P-256,P-384和P-521 “NIST推荐的椭圆曲线ID”,也就是相当于命名曲线,rispectively,secp256r1,secp384r1,SEC 2的” secp521r1推荐椭圆曲线域参数“,它们与prime256v1等效,但不是ANSI X9.62 ECDSA主曲线ID中的384和521。用于C#的弹性城堡库支持更多其他曲线,如我感兴趣的secp224k1。

对于第二个问题

可能有人让我如何在C#中,我可以生成像上面的Java代码密钥对的例子吗?

我找到了一个古老的例子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#初学者,这个代码不是我的。 :)