13

RSACryptoServiceProviderを自分の公開鍵と秘密鍵で初期化しようとしています。

私が調査できる限り、これを行う方法は、コンストラクターを次のように呼び出すことです。

RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams);

上記のcspParams。ただし、msdnの使用例を見ると、http: //msdn.microsoft.com/en-us/library/ca5htw4f.aspx

彼らが秘密鍵または公開鍵を設定する場所は見当たりません。KeyContainerのみを使用します。cspParamなしでRSACryptoServiceProviderを作成すると、デフォルトでは公開鍵のみを使用するように設定されます。クラス自体のPublicOnly変数をチェックすると、これに気付きます。これは読み取り専用変数です。

私の質問は、このクラスを初期化してから、独自の秘密鍵と公開鍵を設定する方法です。サーバーは秘密鍵を使用し、クライアントは公開鍵を使用します。

私が見つけたのは、RSAParameterオブジェクトを作成し、そのオブジェクトに.Exponentパラメーターと.Modulusパラメーターをそれぞれパブリック変数とプライベート変数として設定することです。

しかし、RSACryptoServiceProviderが正しいコンストラクターで初期化されていないと思われるため、 「MissingPrivateKey」エラーが発生します。

以下は私のコードの一部です。BigIntegerクラスについて心配する必要はありません。これは単なる実験です。使用してもしなくても同じエラーになります。

//Create a UnicodeEncoder to convert between byte array and string.
UnicodeEncoding ByteConverter = new UnicodeEncoding();

byte[] dataToEncrypt = ByteConverter.GetBytes(password);
byte[] encryptedData;
byte[] decryptedData;

//RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSAParameters rsap = new RSAParameters();

BigInteger n = new BigInteger("19579160939939334264971282204525611731944172893619019759209712156289528980860378672033164235760825723282900348193871051950190013953658941960463089031452404364269503721476236241284015792700835264262839734314564696723261501877759107784604657504350348081273959965406686529089170062268136253938904906635532824296510859016002105655690559115059267476786307037941751235763572931501055146976797606538425089134251611194500570922973015579287289778637105402129208324300035518642730384616767241853993887666288072512402523498267733725021939287517009966986976768028023180137546958580922532786773172365428677544232641888174470601681", 10);

BigInteger e = new BigInteger("65537", 10);

//rsap.Modulus = ByteConverter.GetBytes(publicKey);
rsap.Exponent = e.getBytes();
rsap.Modulus = n.getBytes();
  /*rsap.Exponent = ByteConverter.GetBytes(publicKey);
    rsap.D = ByteConverter.GetBytes(publicKey);
    rsap.DP = ByteConverter.GetBytes(publicKey);
    rsap.DQ = ByteConverter.GetBytes(publicKey);
    rsap.P = ByteConverter.GetBytes(publicKey);
    rsap.Q = ByteConverter.GetBytes(publicKey);
    rsap.InverseQ = ByteConverter.GetBytes(publicKey);*/

using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
    //RSA.PublicOnly = false;

    RSA.ImportParameters(rsap);

    Debug.Log ("PublicOnly: " + RSA.PublicOnly);

    Debug.Log (rsap.Modulus.Length);
    //Debug.Log (RSA.ToString());
        //Pass the data to ENCRYPT, the public key information  
        //(using RSACryptoServiceProvider.ExportParameters(false), 
        //and a boolean flag specifying no OAEP padding.
        //encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, rsap, false);
        encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);


        Debug.Log ("encryptedData: " + encryptedData);
        //Display the decrypted plaintext to the console. 
        //Debug.Log("Decrypted plaintext: " + ByteConverter.GetString(""));

        //Pass the data to DECRYPT, the private key information  
        //(using RSACryptoServiceProvider.ExportParameters(true), 
        //and a boolean flag specifying no OAEP padding.
        decryptedData = RSACSPSample.RSADecrypt(encryptedData, RSA.ExportParameters(true), false);
}


//encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, rsap, false);

//if (encryptedData != null) {
    password = ByteConverter.GetString(decryptedData);
//}
4

2 に答える 2

21

フィールドはひどい名前が付けられており、混乱を招きます。このExponentフィールドは、実際には公開鍵の公開指数です。秘密鍵の秘密指数はDフィールドです。

MSDNのドキュメントが悪いのはあなたのせいではありません。

于 2012-11-30T23:07:56.950 に答える
0

Base64を変換する必要があります。

byte[] modulusBytes = Convert.FromBase64String(modulus);
byte[] exponentBytes = Convert.FromBase64String(exponent);
于 2015-10-30T12:10:59.623 に答える