3

異なる指数サイズに遭遇する可能性のあるソフトウェアの単体テストを作成しています。(このRFCのセクション3.3.1を参照してください

Bouncy Castleまたはその他のC#ライブラリを使用して、65537のキーサイズを持たないRSAキーペアを生成するにはどうすればよいですか。

答えが、秘密鍵も更新する限り、これを直接変更できるということである場合、公開鍵と秘密鍵に対してどのような特定の変更(または再計算)を行う必要がありますか?

指数が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);
4

1 に答える 1

2

@BrettHaleのおかげで問題を解決できました。

これは、Bouncy Castle でキー ペアを作成する方法です。

      // 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);

RSAKeyGenerationParameters を使用するという彼の推奨事項に関連する追加のリンクには、次のものがあります。

于 2012-07-01T20:27:17.647 に答える