RSACryptoServiceProvider inicjuje się za pomocą własnego klucza publicznego i klucza prywatnego
Usiłuję zainicjować RSACryptoServiceProvider za pomocą własnych kluczy publicznych i prywatnych.
O ile mogłem to zbadać, sposobem na to jest wywołanie konstruktora za pomocą
RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams);
cspParams jak pokazano powyżej. Jednak gdy patrzę na przykład msdn na temat jego użycia:http://msdn.microsoft.com/en-us/library/ca5htw4f.aspx
Nie widzę żadnego miejsca, w którym ustawiają klucze prywatne lub publiczne. Tylko przy użyciu KeyContainer. Kiedy tworzę RSACryptoServiceProvider bez cspParam, domyślnie jest on ustawiony tylko do używania klucza publicznego. Dostrzegam to, gdy sprawdzam zmienną PublicOnly w samej klasie i jest to zmienna tylko do odczytu.
Moje pytanie brzmi: jak zainicjować tę klasę, a następnie ustawić własne klucze prywatne i publiczne. Serwer będzie używał klucza prywatnego, a klient będzie miał klucz publiczny.
Odkryłem, że tworzenie obiektu RSAParameter i ustawianie na nim parametrów .Exponent i .Modulus jako odpowiednio zmiennych publicznych i prywatnych.
Ale dostaję„Brakujący klucz prywatny” błąd, ponieważ uważam, że RSACryptoServiceProvider nie jest zainicjowany poprawnym konstruktorem.
Poniżej znajduje się część mojego kodu. Nie martw się o klasę BigInteger, to tylko eksperyment. Nawet jeśli go użyję, otrzymam ten sam błąd.
//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);
//}