Tôi đang cố gắng khởi tạo RSACryptoServiceProvider bằng các khóa riêng và khóa riêng của mình.RSACryptoServiceProvider khởi tạo với khóa công khai và khóa riêng
Theo như tôi có thể nghiên cứu, cách để làm điều này là để kêu gọi các nhà xây dựng với
RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams);
cspParams như trình bày ở trên. Tuy nhiên, khi tôi xem ví dụ msdn về việc sử dụng nó: http://msdn.microsoft.com/en-us/library/ca5htw4f.aspx
Tôi không thấy bất kỳ nơi nào họ đặt khóa cá nhân hoặc khóa công khai. Chỉ sử dụng KeyContainer. Khi tôi tạo một RSACryptoServiceProvider mà không có một cspParam, thì nó được thiết lập mặc định để chỉ sử dụng một khóa công khai. Tôi nhận thấy điều này khi tôi kiểm tra biến PublicOnly trên chính lớp đó và nó là biến chỉ đọc.
Câu hỏi của tôi là làm thế nào để tôi khởi tạo lớp này và sau đó đặt khóa riêng tư và công khai của riêng tôi. Máy chủ sẽ sử dụng khóa riêng và khách hàng sẽ có khóa công khai.
Điều tôi phát hiện ra là tạo đối tượng RSAParameter và thiết lập tham số .Exponent và .Modulus trên nó dưới dạng biến công khai và riêng tư tương ứng.
Nhưng tôi nhận được "Thiếu khóa cá nhân" lỗi vì tôi tin rằng RSACryptoServiceProvider không được khởi tạo với hàm tạo chính xác.
Dưới đây là một số mã của tôi. Đừng lo lắng về lớp BigInteger, nó chỉ là một thử nghiệm. Ngay cả khi tôi sử dụng nó hay không, tôi nhận được cùng một lỗi.
//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);
//}
Chìa khóa công cộng được xác định bởi Exponent và Modulus của RSA Params. Khóa riêng, là D trong lớp RSAParameters – craig1231
Vì vậy, làm cách nào để đặt khóa công khai của Thông số RSAP? Tôi đã có khóa công khai của mình, chỉ cần đặt đối tượng RSAParameter để tôi có thể sử dụng nó. – c0d3Junk13
Tùy thuộc vào việc bạn có khóa công cộng và khóa riêng tư, nếu không thì bạn có thể sử dụng CSPParams để tạo cặp. – craig1231