2012-11-30 2 views
7

Я пытаюсь инициализировать RSACryptoServiceProvider своими собственными общедоступными и закрытыми ключами.RSACryptoServiceProvider инициализируется собственным открытым ключом и закрытым ключом

Насколько я мог исследовать, способ сделать это, чтобы вызвать конструктор с

RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams); 

cspParams, как показано выше. Однако, когда я смотрю на пример msdn по его использованию: http://msdn.microsoft.com/en-us/library/ca5htw4f.aspx

Я не вижу места, где они устанавливают частные или открытые ключи. Только с помощью KeyContainer. Когда я создаю RSACryptoServiceProvider без cspParam, тогда по умолчанию устанавливается только открытый ключ. Я замечаю это, когда проверяю переменную PublicOnly на самом классе и является переменной только для чтения.

Мой вопрос в том, как инициализировать этот класс, а затем установить свои личные и открытые ключи. Сервер будет использовать закрытый ключ, и клиент будет иметь открытый ключ.

То, что я узнал, это создание объекта RSAParameter и установка на нем параметров .Exponent и .Modulus как общедоступных и частных переменных соответственно.

Но я получаю «Отсутствующий секретный ключ» ошибка, так как я считаю, что RSACryptoServiceProvider не инициализирован правильным конструктором.

Ниже приведена часть моего кода. Не беспокойтесь о классе 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); 
//} 
+0

Открытый ключ определяется по экспоненте и Modulus АСР Params. Закрытый ключ - это D в классе RSAParameters – craig1231

+0

Итак, как мне настроить открытый ключ RSAParameter? У меня уже есть открытый ключ, просто нужно установить объект RSAParameter, чтобы я мог его использовать. – c0d3Junk13

+0

Зависит от использования открытого и закрытого ключа, если нет, то вы можете использовать CSPParams для создания пары. – craig1231

ответ

16

Поля ужасно названы, и это вас сбивает с толку. Поле Exponent действительно является общественностью экспонентом для открытого ключа. частный показатель для частного ключа - D.

Это не ваша вина, что документация MSDN засасывает.

+0

Да, эти переменные ужасно названы. Позвольте мне попробовать и вернуться к вам. Благодаря! – c0d3Junk13

+0

Теперь я получаю недостающую ошибку модуля. Любая идея, что это значит? Или что мне нужно, чтобы установить переменную модуля? Означает ли это, что мне не нужно инициализировать cspParams? – c0d3Junk13

+2

Модуль - это модуль. Если вы посмотрите на ['RSAParameters'] (http://msdn.microsoft.com/en-us/library/ke2te33h.aspx), структура вашего открытого ключа RSA имеет только поля Module и Exponent, но RSA private имеет * все * поля. –

0

Вы должны преобразовать базу 64:

byte[] modulusBytes = Convert.FromBase64String(modulus); 
byte[] exponentBytes = Convert.FromBase64String(exponent);