Сохранение ключей в формате XML

Не всегда возможно передать содержимое объекта ExportParameters напрямую между двумя приложениями, тем более, если речь идет о разных платформах или хотя бы о разных криптографических библиотеках. В конце концов, класс ExportParameters специфичен для Microsoft и для .NET. Более удобный и универсальный способ передачи открытого ключа заключается в использовании XML-потока[1]. Пример программы Saving- KeysAsXml показывает, как следует записывать и считывать ключи в формате XML. Этот пример почти идентичен предыдущей программе. Главное отличие состоит в том, что для хранения и передачи открытого ключа между методом шифрования и методом дешифрования мы используем XML вместо объекта ExportParameters. Еще одно отличие заключается в том, что информация о параметрах RSA не отображается, а вместо этого отображается содержимое XML-потока.

Ради простоты и наглядности мы вновь используем монолитное приложение, объединяющее обе функции на одной экранной форме. Не составит никакого труда разделить программу на две части, выполняющие, по-отдельности, шифрование и дешифрование. Для того чтобы сделать пример более реалистичным, XML-данные здесь записываются в файл. Этим мы имитируем сценарии реального мира, где подобную информацию приходится записывать и передавать при помощи какого-то внешнего носителя или сетевого соединения. С точки зрения программиста наиболее серьезные изменения по отношению к предыдущей программе заключаются в том, что вызовы методов ExportParameters и ImportPara- meters класса RSACryptoServiceProvider заменены вызовами методов ToXmlString и FromXmlString, принадлежащих тому же классу. Здесь также используется логический аргумент, указывающий, нужно ли включать в информацию секретный ключ.

Ниже приведен код метода GenerateNewRSAParams, который выполняет здесь те же функции, что и в предыдущей программе. Разница состоит в том, что данные мы сохраняем в двух XML-файлах PublicPrivateKey.xml и PublicOnlyKey.xml. Эти два файла затем используются функциями шифрования и дешифрования.

private void GenerateNewRSAParams()

{

//установить асимметричный алгоритм RSA

RSACryptoServiceProvider rsa =

new RSACryptoServiceProvider();

//открытый и секретный ключи RSA StreamWriter writer =

new StreamWriter("PublicPrivateKey.xml"); string publicPrivateKeyXML =

rsa.ToXmlString(true); writer.Write(publicPrivateKeyXML); writer.Close();

//только открытый ключ RSA writer =

new StreamWriter("PublicOnlyKey.xml") ; string publicOnlyKeyXML =

rsa.ToXmlString(false); writer.Write(publicOnlyKeyXML); writer.Close();

//отобразить оба ключа RSA

textBoxPublicKeyXML.Text = publicPrivateKeyXML;

//работаем с пользовательским интерфейсом

}

Наконец, метод buttonDecrypt_Click создает собственный экземпляр класса RSACryptoServiceProvider, но инициализирует его методом From- XinlString, используя файл PublicPrivateKey.xml, в котором содержится полная пара ключей, необходимая для дешифрования.

private void buttonDecrypt_Click(

object sender, System.EventArgs e)

{

//установить асимметричный алгоритм RSA //при помощи ключа из XML-файла RSACryptoServiceProvider rsa =

new RSACryptoServiceProvider();

//открытый и секретный параметры RSA для дешифрования StreamReader reader =

new StreamReader("PublicPrivateKey.xml"); string publicPrivateKeyXML = reader.ReadToEnd(); rsa.FromXmlString(publicPrivateKeyXML); reader.Close();

//прочитать шифрованный текст и дешифровать его byte[] plainbytes = rsa.Decrypt( cipherbytes,

false); // использование fOAEP требует //пакета шифрования

//отобразить полученный открытый текст //работаем с пользовательским интерфейсом

}

На рисунке 4.4 изображено окно программы SavingKeysAsXml, используемой для шифрования и дешифрования сообщений. На форме, кроме прочего, отображается содержимое файла PublicPrivateKey.xml, которое используется для дешифрования. Довольно трудно разобрать содержимое XML-элементов, слитых в один непрерывный поток, но если присмотреться, вы увидите там значения параметров RSA. Метод шифрования использует только значения модуля и показателя.

Пример программы SavingKeysAsXml

Рис. 4.4. Пример программы SavingKeysAsXml

  • [1] Способ передачи открытого ключа (объект ExportParameters или XML-поток) не имеетотношения к вопросам безопасности. Разумеется, вам не следует передавать секретныйасимметричный ключ или сеансовый симметричный ключ по открытому каналу. Для обмена чувствительной информацией следует зашифровать ключ шифрования. На первыйвзгляд это похоже на рекурсию, однако на самом деле в таком шифровании есть смысл.В главе 6 мы увидим, как передавать зашифрованные ключи при помощи XML, используя криптографические стандарты XML.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ ОРИГИНАЛ   След >