2012-11-30 47 views
7

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); 
//} 
+0

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

+0

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

+0

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

Trả lời

16

Các trường được đặt tên khủng khiếp và gây nhầm lẫn cho bạn. Trường Exponent thực sự là số mũ công khai công khai cho khóa công khai. Số điện thoại riêng cho khóa cá nhân là trường D.

Nó không phải là lỗi của bạn mà tài liệu MSDN hút.

+0

Đúng, những biến đó được đặt tên khủng khiếp. Hãy để tôi thử điều đó và lấy lại cho bạn. Cảm ơn! – c0d3Junk13

+0

Hiện tại, tôi đang gặp lỗi mô-đun bị thiếu. Bất kỳ ý tưởng đó có nghĩa là gì? Hoặc tôi cần phải đặt biến Modulus là gì? Điều này có nghĩa là tôi không cần phải khởi tạo với cspParams? – c0d3Junk13

+2

Mô đun là ... mô đun. Nếu bạn nhìn vào một ['RSAParameters'] (http://msdn.microsoft.com/en-us/library/ke2te33h.aspx) Cấu trúc khóa công khai RSA của bạn chỉ có các trường Modulus và Exponent nhưng riêng RSA có * tất cả * các trường. –

0

Bạn cần phải chuyển đổi cơ sở 64:

byte[] modulusBytes = Convert.FromBase64String(modulus); 
byte[] exponentBytes = Convert.FromBase64String(exponent); 
Các vấn đề liên quan