Программирование при помощи.NET Asymmetric Cryptography Пространство имен System.Security.Cryptography.

Презентация:



Advertisements
Похожие презентации
В верхнем левом уrлу этой диаrраммы мы берем исходное сообщение и создаем 160-битовый хеш (дайджест сообщения) при помощи алrоритма SНAl. Затем дайджест.
Advertisements

Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Базы данных Учебная презентация. Определение База данных (БД) – это информационная модель, позволяющая в упорядоченном виде хранить данные о группе объектов,
1 [ИНФОРМАЦИОННАЯ БЕЗОПАСТНОСТЬ] [Институт ИИБС, Кафедра ИСКТ] [Шумейко Е.В.] Криптография с открытым ключом.
Криптография в.NET Кондратьев Денис Visual.NET User Group vng.visualdesign.ru.
Асимметричная криптография. Проблемы и идеи. Проблемы, связанные с использованием симметричных шифров Симметричные алгоритмы обеспечивают эффективное.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Тема: массивы в PHP Изучить возможности языка PHP при решении задач, требующих использования массивов. Рассмотреть примеры использования массивов при создании.
Интегрированная среда разработки языкаVisual BasicИнтегрированная среда разработки языкаVisual BasicИнтегрированная среда разработки языкаVisual BasicИнтегрированная.
Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
Зашифрованные файлы можно использовать совместно с другим пользователем или между двумя компьютерами. Зашифрованные Чтобы использовать зашифрованные файлы.
Тема 5. Основы современной технологии программирования Программирование в средах современных информационных систем. Интегрированные системы разработки.
Создание базы данных. Пусть нам необходимо разработать базу данных «Класс», которая содержит информацию, об учениках и их увлечениях.
Создание базы данных с помощью Конструктора Создание базы данных без помощи Мастера Теперь попробуем создать базу данных без помощи Мастера. При запуске.
«Защита базы данных» Преподаватель: Французова Г.Н.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Выполнение запросов, создание и редактирование отчета MS Access.
Связи между таблицами являются необходимым элементом структуры БД. Для того, чтобы связь была возможна, таблицы должны иметь общие поля. Чаще всего в одной.
Транксрипт:

Программирование при помощи.NET Asymmetric Cryptography Пространство имен System.Security.Cryptography

Для иллюстрации этой темы мы рассмотрим примеры программ RSAAIgorithm и Sa­vingKeysAsXml. Эти два образца кода покажут, как следует шифровать и дешифровать при помощи алгоритма RSA, а также как сохранять и извлекать информацию о ключах в формате XML.

Пример использования алгоритма RSA Пример RSAAIgorithm использует конкретный класс RSACryptoServiceProvider, принадлежащий абстрактному классу AsymmetricAIgorithm.

Пример программы RSAAIgorithm Программа предназначена для шифрования и дешифрования сообщений. Вы можете ввести текст сообщения в текстовое поле в верхней части формы. После этого, щелчком на кнопке Encrypt, вы зашифруете сообщение и заполните все поля формы кроме последнего поля (в остальных полях появятся параметры RSA). Наконец, щелчок на кнопке Decrypt расшифрует дaнные, которые отобразятся в самом нижнем поле. Разумеется, расшифрованное сообщение окажется идентичным исходному открытому тексту.

Скрин-шот программы RSAAlgorithm

Исходный код программы RSAAIgorithm Пара ключей генерируется программой при запуске автоматически, но можно сгенерировать новую пару нажав на кнопку New RSA Parametrs, которая вызывает функцию GenerateNewPArams. Впервые эта функция вызывается и генерирует новые ключи при запуске формы. private void GenerateNewRSAParams() { //установить ассиметричный алгоритм RSA RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); //извлечь открытые и секретные параметры RSA rsaParamsIncludePrivate = rsa.ExportParameters(true); // извлечь только открытыe параметры RSA rsaParamsExcludePrivate = rsa.ExportParameters(false); … }

void GenerateNewRSAParams() Этот метод создает объект класса RSACryptoServiceProvider извлекает его внешние и внутренние параметры с помощью метода ExportParametrs RSA класса и отображает эти параметры в пользовательском интерфейсе. Фактически эти параметры хранятся в полях типа RSAParametrs.RSACryptoServiceProvider ExportParametrs //необходимые для шифрования RSAParameters rsaParamsExcludePrivate; //открытые и секретные параметры RSA для дешифрования RSAParameters rsaParamslncludePrivate; Поле этого типа с именем rsaParamsExcludePrivate содержит значения открытых параметров, которые необходимы для шифрования, выполняемого методом buttonEncript_Click. Поле этого типа с именем rsaParamsIncludePrivate содержит значения открытых и секретных параметров, которые необходимы для дешифрования методом buttonDecript_Click.

Коrда мы создаем экземпляр класса RSACryptoServiceProvider, то получаем, фактически, реализацию RSA, предоставляемую провайдером услуг криптографии (CSP). Этот класс напрямую производится из класса RSA. Класс RSA предусматривает возможность иметь несколько реализаций алгoритма RSA, существующих как производные классы, однако в настоящее время доступна только реализация CSP.

Метод ExportParameters здесь вызывается дважды. Первый раз методу задается аргумент True, а во второй ­ False. Значение True указывает методу, что в информацию необходимо включить все, в том числе секретный ключ. При вызове с аргyментом False метод экспортирует только информацию, относящуюся к открытому ключу.

void buttonEncrypt_Click( object sender, System.EventArgs е) В методе buttonEncrypt_Click создается новый экземпляр класса RSACryptoServiceProvider, инициализируя eгo сохраненной информацией открытогo ключа при помощи метода ImportParameters объекта RSA (при этом в качестве aргументa используя поле rsaParamsExcludePrivate). Далее мы получаем открытый текст в виде байтового массива с именем plainbytes. private void buttonEncrypt_Click( object sender, System.EventArgs е) { //работаем с пользовательским интерфейсом …. //установить асимметричный алгоритм RSA RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); // извлечь только открытые пaраметры RSA дли шифрования rsa.lmportparameters(rsaParamsExcludePrivate); //прочитать открытый текст и зашифровать eгo byte [] plainbytes = Encoding.UTF8.Getвytes(textplaintext.Text);

Далее выполняется главное действие, вызывая метод Encrypt объекта RSA. Этот вызов возвращает байтовый массив с именем cipherbytes. Это не локальная переменная, а свойство конкретного экземпляра объекта, поскольку нам потребуется передать этот массив методу, выполняющему дешифрование. cipherbytes = rsa.Encrypt(plainbytes, false); // использование fOAEP требует // пaкета шифрованиия //отобразить зашифрованный текст …. // Отобразить зашифрованный текст …. //в шестнадцатеричном формате …. //работаем с пользовательским интерфейсом …. }

Метод Encrypt() Пример RSAAIgorithm использует метод Encrypt класса RSACryptoServiceProvider. Этот метод получает на входе два параметра, первый из которых должен представлять собой байтовый массив, содержащий входные данные. Второй параметр, булево значение, должен указывать на режим дополнения, который должен использовать метод. Дополнение требуется потому, что алгоритм требует фиксированного размера блока входных данных. Для достижения этого размера необходимо будет дополнять реальные данные.

Если второму параметру присвоено значение True, то для дополнения будет использовать­ся технология ОАЕP. В противном случае используется традиционный режим дополнения PKCS#1 vl.5. Метод Encrypt возвращает результирующие зашифрованные данные в виде байтового массива.

void buttonDecrypt_Click (object sender, System.EventArgs е) Метод buttonDecrypt_Click вызывается по щелчку пользователя на кнопке Decrypt. Снова, точно так же, создается объект RSA. Информация в этот объект загружается при помощи eгo метода ImportParameters, однако на этот раз apгyмeнтoм служит поле rsaParamsIncludePrivate, поскольку для дешифрования необходим как открытый, так и секретный ключи. private void buttonDecrypt_Click (object sender, System.EventArgs е) { //Установить асимметpичный алгоритм RSA RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); / /импортировать открытый и секретный ключи rsa.Importparameters(rsaparamslncludePrivate);

Метод Decrypt() Открытый текст мы получаем обращением к методу Decrypt объекта RSA. Первый параметр ­ байтовый массив, содержащий зашифрованные данные. Второй параметр имеет точно такой же смысл, что и в методе Encrypt. Возвращаемое значение представляет собой байтовый массив с расшифрованными данными. Поскольку для шифрования и дешифрования использовались ключи RSA, принадлежащие к одной паре, результирующий дешифрованный текст в точности совпадет с исходным. //прочитать зашифровaнный текст и дешифровать eгo byte [] plainbytes = rsa.Decrypt( cipherbytes, false); // отобразить полученный открытый текст …. //работаем с пользовательским интерфейсом …. }

Сохранение ключей в формате XML Не всегда возможно передать содержимое объекта ExportParameters нa прямую между двумя приложениями, тем более, если речь идет о разных платформах или хотя бы о разных криптоrрафических библиотеках. Более удобный и универсальный способ передачи открытого ключа заключается в использовании ХМL-потока.

Пример программы SavingKeysAsXml Этот пример почти идентичен предыдущей программе. Главное отличие состоит в том, что для хранения и передачи открытогo ключа между методом шифрования и методом дешифрования мы используем XML вместо объекта ExportParameters. Еще одно отличие заключается в том, что информация о параметрах RSA не отображается, а вместо этого отображается содержимое ХМL потока.

Наиболее серьезные изменения по отношению к предыдущей программе заключаются в том, что вызовы методов ExportParameters и ImportParameters класса RSACryptoServiceProvider заменены вызовами методов ToXmlString и FromXmlString, принадлежащих тому же классу. Здесь также используется логический apгумент, указывающий, нужно ли включать в информацию секретный ключ.

void GenerateNewRSAParams() private void GenerateNewRSAParams() { //установить асимметричный алгоритм RSA RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); / /Открытый и секретный ключи RSA StreamWriter writer = new StreamWriter("PublicPrivateKey.xml"); string publicPrivateKeyXМL = rsa.ToXmlString(true); writer.Write(publicPrivateKeyXМL); writer.Close() ; //только открытый ключ RSA writer = new StreamWriter("PublicOnlyKey.xml"); string publicOnlyKeyXМL = rsa.ToXmlString(false); writer.Write(publicOnlyKeyXМL); writer.Close(); //отобразить оба ключа RSA textвoxPublicKeyXМL.Text = publicPrivateKeyXМL; //работаем с пользовательским интерфейсом … }

void buttonDecrypt_Click(object sender, System.EventArgs е) private void buttOnDecrypt_Click(object sender, System.EventArgs е) { //установить асимметричный алrоритм RSA //при помощи ключа из XМL файла RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); / /открытый и секретный пaраметры RSA для дешифрования StreamReader reader = new StreamReader("PublicPrivateKey.xml"); string publicPrivateKeyXМL = reader.ReadToEnd(); rsa.FromXmlString(PublicPrivateKeyXМL); reader.Close(); //прочитать шифрованный текст и дешифровать eгo byte [] plainbytes = rsa.Decrypt( cipherbytes, false); //отобразить полученный открытый текст … //работаем с пользовательским интерфейсом … }

Скрин-шот программы SavingKeysAsXml