Ключевые слова: Цифровая подпись, симметричный шифр, ассиметричный шифр, xml-документ.
Abstract. Article is devoted to the use of xml - document for digital signatures and encryption. Since this type of document is often used on the web - services, but by itself does not encrypt the data, only provides such an opportunity, there is a need to create programs and solutions that perform these functions to the fullest.
Keywords: Digital signature , symmetric cipher , asymmetric cipher , xml- document.
Введение
В данной статье рассмотрены вопросы использования xml – документов для цифровой подписи и шифрования данных. Так как этот тип документа зачастую используется при пересылке почты, на веб – сервисах, и других защищенных службах, но сам по себе не шифрует данные, а лишь предоставляет такую возможность, то возникает потребность в создании программ и решений, выполняющих эти функции в полной мере.
Для проведения криптографических операций требуется сам XML-документ и инструмент, позволяющий автоматизировать процесс.
Мной был разработан инструментарий, который позволяет подписывать и проверять цифровую подпись XML-документа, а также шифровать и дешифровывать этот документ.
Разработка проводилась с использованием платформы .NET Framework.
В качестве примера XML-документа рассмотрим данные кредитной карты в формате XML.
Реализация электронной цифровой подписи
Электронная подпись – мощное средство контроля подлинности информации в электронном виде, обеспечения целостности электронных данных, подтверждения их авторства и актуальности. Электронная подпись - это информационный объект, создаваемый для подписываемых данных, позволяющий удостовериться в целостности и аутентичности этих данных.
Распространенное мнение об электронной подписи – «это что-то криптографическое» - верно лишь отчасти. Электронная подпись – это формализованная структура, электронный документ, состоящий из набора обязательных и не обязательных реквизитов – атрибутов электронной подписи. В состав обязательных атрибутов как раз и входит криптографическая часть, обеспечивающая надёжную идентификацию подписываемых данных и гарантирует надёжность источника информации о подписавшем.
Кроме криптографической части, электронная подпись обязательно содержит минимальную информацию о подписавшем и некоторую техническую информацию. Для прикладного использования, электронная подпись может содержать дату и время подписания, сведения для дополнительных механизмов проверки подписи, расширенную информацию о подписавшем, его полномочия и отношение к подписываемым данным, комментарии, файлы, графическое изображение собственноручной подписи и другие, функционально востребованные, данные.
Криптографические цифровые подписи используют алгоритмы с открытым ключом для обеспечения целостности данных. При подписывании данных с помощью цифровой подписи, другая сторона может проверить подпись и убедиться в том, что данные поступили из соответствующего источника и не были изменены после подписывания.
Опишем мою реализацию модуля подписывания xml – документа.
Программа цифровой подписи работает с xml документом. Для того, чтобы воспользоваться готовыми модулями, методами и свойствами, позволяющими работать с цифровыми подписями, шифроватьдешифровать данные, необходимо подключить пространства имён соответствующих библиотек.
Оператор выделения памяти – позволяет динамически выделить память под переменные определённого типажа.
Параметр имя контейнера с ключом – позволяет задать имя контейнера с ключом, с помощью которого в последствии можно сгенерировать сам RSA – ключ.
Параметр использования пробелов – позволяет определить, будут ли учитываться пробелы при шифровании/дешифровании документов.
Метод загрузки позволяет загружать данные xml файла в переменную соответствующего типа.
Модуль подписывания xml файла – подписывает файл, для этого принимает переменную типа xml и ключ. Возвращает подписанный документ.
Модуль попытки – принимает все вышеописанные действия, пытается их осуществить. Если не получится, то далее включится модуль отлова исключений.
Модуль отлова исключений – отлавливает исключения, пробрасывает их в вышестоящую функцию/программу. Предназначен для остановки программы в крайних, неудовлетворяющих условию ситуациях (невозможно сгенерировать ключ, открыть файл, записать в файл, подписать файл и т.д.).
Оператор условия – описывает условие, при котором будет выполняться подписывание. В данной программе он необходим для проверки файла и ключа на содержимое. Если содержимое пусто, то следовательно нечего и подписывать, пробросится исключение.
Переменная подписанного документа – переменная, принимающая xml документ при своей инициализации.
Параметр ключа для подписи – параметр, который принимает значение ключа для подписывания данных.
Переменная ссылки – содержит в себе ссылки.
Метод добавления ссылок – добавляет ссылки на информацию о способе подписи и т.д.
Метод добавления подписанных данных в xml файл, берёт в себя подписанные данные xml файла и записывает их.
Использовались стандартные модули С#, содержащие методы, функции и классы, необходимые для цифровой подписи: using System, using System.Security.Cryptography, using System.Security.Cryptography.Xml, using System.Xml. Сама программа представляет собой цельномодульный скрипт с набором функций:
public class SignXML – основной класс программы, в теле которого создается цифровая подпись, включает два производных класса.
public static void Main – основной класс программы цифровой подписи, в нём создаются переменные для хранения данных xml файла, генерации ключа, его параметров.
CspParameters – контейнер для создания параметров ключа.
RSACryptoServiceProvider rsaKey – переменная класса RSA ключа.
new – оператор выделения динамической памяти для переменных соответствующего типа.
KeyContainerName – свойство, определяющее имя ключа.
XmlDocument – класс, в котором экземплярах которого хранятся xml документы.
PreserveWhitespace – свойство, определяющее, будут ли учитываться пробелы при шифровании.
Load – метод, который загружает данные из файла в переменную xml документа.
public static void SignXml – класс подписи документа, берёт в себя xml документ и ключ для подписи, записывает результат в xml файл.
Catch – блок, который отлавливает исключения.
WriteLine – метод, который выводит сообщение на экран.
If – оператор условия, в данной программе используется для проверки наличия данных в файле и ключе.
throw – оператор проброса исключений.
SignedXml – класс, позволяющий работать с подписанными xml файлами.
SigningKey – свойство класса SignedXml, хранящее значение ключа для подписи.
Reference – класс ссылок, необходим для создания ссылок в подписанном файле.
XmlDsigEnvelopedSignatureTransform – представляет преобразование запечатанной подписи для цифровой подписи XML.
AddTransform –добавляет объект System.Security/Cryptography.Xml в список преобразований данных перед их передачей алгоритму хэширования.
AddReference – метод добавления ссылок. Берёт в себя ссылку и добавляет её в подписанный XML файл.
ComputeSignature – метод, который вычисляет цифровую подпись.
GetXml –метод, который возвращает XML-представление объекта System.Security.Cryptography.Xml.SignedXml.
AppendChild –добавляет указанный узел в конец списка дочерних узлов данного узла, берёт в себя цифровую подпись, импортированную в XML файл.
Для хеширования необходимо воспользоваться модулем import hashlib import sys, from rsa import *, import string, import random.
Необходимо задать кодировку тексту # -*- coding: utf-8 -*- и считать его из файла методом read, при этом лучше убрать все символы перевода строки методом replace("n",""), зашифровать данные XML - файла методами hashlib.sha1, update, и hexdigest.
Метод find найдёт индекс подстроки в строке. Метод write запишет полученные данные в файл. Метод close закроет XML-файл после работы с ним.
Рис.1 Блок-схема алгоритма реализации электронной цифровой подписи
Реализация программы шифрования/дешифрования XML – элементов с помощью симметричного ключа.
Программа шифрования/дешифрования также работает с xml-документом. Для того, чтобы воспользоваться готовыми модулями, методами и свойствами, позволяющими шифроватьдешифровать данные, необходимо подключить пространства имён соответствующих библиотек.
Оператор выделения памяти – позволяет динамически выделить память под переменные определённого типажа.
Параметр использования пробелов – позволяет определить, будут ли учитываться пробелы при шифровании/дешифровании документов.
Метод загрузки позволяет загружать данные xml файла в переменную соответствующего типа.
Модуль попытки – принимает все вышеописанные действия, пытается их осуществить. Если не получится, то далее включится модуль отлова исключений.
Модуль отлова исключений – отлавливает исключения, пробрасывает их в вышестоящую функцию/программу. Предназначен для остановки программы в крайних, неудовлетворяющих условию ситуациях (невозможно сгенерировать ключ, открыть файл, записать в файл, подписать файл и т.д.).
Оператор условия – описывает условие, при котором будет выполняться подписывание. В данной программе он необходим для проверки файла и ключа на содержимое. Если содержимое пусто, то следовательно нечего и подписывать, пробросится исключение.
Модуль шифрования – принимает XML файл, область, которую необходимо зашифровать и ключ. Шифрует данные в XML файле.
Модуль дешифрования – принимает XML файл и ключ для дешифрования, дешифрует данные в XML файле.
Блок финала – задает действия, которые будут выполняться в итоге, после блоков попытки и отлова. В данной программе очищает ключ.
class Program –основной класс программы в теле которого проводятся необходимые операции шифрования/дешифрования.
static void Main – основная функция программы.
RijndaelManaged key - создает ключ шифрования Rijndael, необходимый для шифрования/дешифрования по симметричному алгоритму DES, осуществляет доступ к управляемой версии алгоритма System.Security/Criptography.Rijdael.
XmlDocument – класс, в котором экземплярах которого хранятся xml документы.
public static void Encrypt – модуль шифрования. Класс принимает XML файл, область, которую необходимо зашифровать и ключ. Шифрует данные в XML файле.
public static void Decrypt –модуль дешифровки. Класс, который принимает XML файл и ключ для дешифрования, дешифрует данные в XML файле.
try – блок, который пытается что – то сделать.
Catch – блок, который отлавливает исключения.
WriteLine – метод, который выводит сообщение на иэкран.
If – оператор условия, в данной программе используется для проверки на наличие данных в файле и ключе.
throw – оператор проброса исключений.
new – оператор выделения динамической памяти для переменных соответствующего типа.
PreserveWhitespace – свойство, определяющее будут ли учитываться пробелы при шифровании.
Load – метод, который загружает данные из файла, который он принимает, в переменную xml документа.
InnerXml - возвращает или задаёт разметку, отражающую дочерние узлы текущего узла. По сути выводит на консоль результаты шифрования/дешифрования данных XML файла.
GetElementsByTagName – метод, который ищет заданный элемент в XML файле по его тегу.
EncryptedXml – класс, который представляет собой модель для реализации алгоритмов шифрования.
Byte – класс, экземпляры которого являются переменными с объёмом в 1 байт.
EncryptData- метод, который зашифровывает указанный элемент или его содержимое с использованием указанного алгоритма симметричного шифрования принимает элемент для шифрования, ключ и выдаёт последовательность зашифрованных данных в виде байт.
String - класс, необходимый для хранения знаков Юникод.
TripleDES - базовый класс, который представляет собой класс для реализации алгоритма TripleDES.
DES - базовый класс, который представляет собой класс для реализации алгоритма DES.
Rijndael - базовый класс, который представляет собой класс для реализации алгоритма Rijndael.
switch - логический оператор переключения, необходим для выбора размера ключа шифрования.
Case – оператор, который определяет, какие варианты могут быть выбраны в логическом операторе switch.
CipherData.CipherValue – параметры класса, необходимые для добавления в зашифрованный элемент данные EncryptedData.
DecryptData – метод, который принимает зашифрованный документ и ключ, и дешифрует этот элемент.
ReplaceData – заменяет элемент с зашифрованными данными указанной расшифрованной последовательностью байтов.
EncryptedXml.ReplaceElement – создание элемента с использованием ключа.
edElement.EncryptionMethod - создание метода, для опознования шифрования.
struct aes_key - структура для хранения ключа.
aes_expand- функция для вычисления расширенного ключа, принимает структуру ключа и данные ключа, и вычисляет расширенную версию
aes_encrypt - функция шифрования, принимает ключ, исходный текст и переменную, в которую будет сохранён результат.
aes_sub_bytes-функция, необходимая для нелинейной подстановки при
шифровании. Принимает выражение и преобразует его.
aes_shift_rows - функция, необходимая для перестановки строк матрицы, принимает строки и переставляет их.
aes_mix_columns – функция, необходимая для перемешивания столбцов, принимает столбцы и перемешивает их.
aes_add_round_key - функция сложения с ключом, принимает ключ, выражение и вспомогательное значение, и применяет к выражению сложение по модулю 2 с ключом.
aes_decrypt - функция дешифрования, принимает ключ, исходный текст и переменную, в которую будет сохранён результат.
Рис.2 Блок-схема алгоритма реализации шифрования
Рис.3 Блок-схема основной функции шифрования
Рис.4 Блок-схема основной функции дешифрования
ЗАКЛЮЧЕНИЕВ данной работе представлены некоторые способы реализации XML-криптографии на основе платформы .NET Framework. Рассмотрены примеры программ осуществляющих эту реализацию. XML-документы – это мощное средство, часто применяющее для защиты данных в сети Интернет. Но, к сожалению, само по себе, это средство не обеспечивает необходимую защиту данных, которые «перевозит».
Защита должна быть основана на выполнении следующих функций:
аутентификации взаимодействующих сторон;
подтверждении подлинности и целостности информации;
криптографическом закрытии передаваемых данных.
Для обеспечения защиты информации целесообразно применять методы электронной цифровой подписи (ЭЦП) и шифрования данных. Причем, как правило, ЭЦП обеспечивает аутентификацию, подтверждение подлинности и целостности, а закрытие данных достигается шифрованием.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВМ. Вельненбах Криптография на Си и С++ в действии. Учебное пособие. – М.: Издательство Триумф, 2004 – 464 с.: ил.
Шифрование. [Электронный ресурс]. URL: https://ru.wikipedia.org/wiki/Шифрование (дата обращения: 23.11.14)
Дешифрование. [Электронный ресурс]. URL: https://ru.wikipedia.org/wiki/Дешифрование (дата обращения: 23.11.14)
XML-криптография. [Электронный ресурс]. URL: http://msdn.microsoft.com/ (дата обращения: 23.11.14)
Защита XML-документов при передаче по открытым коммуникациям. [Электронный ресурс]. URL: http://compress.ru/article.aspx?id=10152 (дата обращения: 3.12.14)
Справочник по языку C++ [Электронный ресурс]. URL: http://msdn.microsoft.com/ru-ru/library/3bstk3k5.aspx (дата обращения: 3.12.14)
11