2012-07-01 194 views
3

我正在为可能遇到不同指数大小的软件创建单元测试。 (see section 3.3.1 of this RFCRSA公开指数默认为65537.该值应该是多少?我的选择有什么影响?

如何使用充气城堡,或任何其他C#库生成RSA密钥对that doesn't have a key size of 65537.

如果答案是,我可以直接修改这个,只要我更新私钥那么,我应该为公钥和私钥做出什么样的具体变化(或重新计算)呢?

下面是我使用创建的65537指数的关键示例代码:

 // Create key 
     RsaKeyPairGenerator generator = new RsaKeyPairGenerator(); 
     var param = new KeyGenerationParameters(new SecureRandom(), 1024); 
     generator.Init(param); 
     AsymmetricCipherKeyPair keyPair= generator.GenerateKeyPair(); 

     // Save to export format 
     SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keyPair.Public); 
     byte[] ret = info.GetEncoded(); 
     string ovalue1 = Convert.ToBase64String(ret); 

     // Read from export format 
     byte[] publicKeyBytes = Convert.FromBase64String(ovalue1); 
     AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(publicKeyBytes); 

     RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter; 
     RSAParameters rsaParameters = new RSAParameters(); 
     rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArray(); 
     rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArray(); 
     RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
     rsa.ImportParameters(rsaParameters); 
+0

'KeyGenerationParameters'有一个子类'RSAKeyGenerationParameters',它可以用公共指数实例化。 –

+1

@BrettHale - 为我解决了它!如果你想要这个答案的代表,请随时张贴.. – LamonteCristo

回答

1

感谢@BrettHale我能解决这个问题。

这是如何在充气城堡创建密钥对,涉及到他的建议使用RSAKeyGenerationParameters

 // Create key 
     RsaKeyPairGenerator generator = new RsaKeyPairGenerator(); 

     /* 
     * This value should be a Fermat number. 0x10001 (F4) is current recommended value. 3 (F1) is known to be safe also. 
     * 3, 5, 17, 257, 65537, 4294967297, 18446744073709551617, 
     * 
     * Practically speaking, Windows does not tolerate public exponents which do not fit in a 32-bit unsigned integer. Using e=3 or e=65537 works "everywhere". 
     */ 
     BigInteger exponentBigInt = new BigInteger(exponent.ToString()); 

     var param = new RsaKeyGenerationParameters(
      exponentBigInt, // new BigInteger("10001", 16) publicExponent 
      new SecureRandom(), // SecureRandom.getInstance("SHA1PRNG"),//prng 
      keyStrength, //strength 
      certaninty);//certainty 
     generator.Init(param); 

其他环节:包括

+0

这些建议很大程度上是由于[Coppersmith的攻击](http://en.wikipedia.org/wiki/Coppersmith's_Attack)及其变体。 –

相关问题