Санкт-Петербургский Государственный Политехнический Университет Факультет Технической Кибернетики Кафедра Измерительных Информационных Технологий Контроль целостности данных в программах сбора и обработки измерительной информации Елисеева О.Н. гр.6085/2 Сальников В.Ю. Доц. Введение Одним из важнейших свойств информационных систем является целостность хранимых в ней данных. Под целостностью данных понимается способность средства вычислительной техники или автоматизированной системы обеспечивать неизменность информации в условиях случайного и (или) преднамеренного искажения. «Случайное искажение» может произойти в случаях аварийного завершения сеанса работы с данными (отключение электричества, ошибка в программе). «Преднамеренное искажение» напротив, как следствие действия злоумышленников. Механизмы защиты целостности информации 1. Своевременное регулярное копирование ценной информации: - дополнительные внешние запоминающие устройства; - специально выделенные области памяти на несъемных машинных носителях; - съемные носители информации. 2. Введение избыточности в саму информацию, то есть применение кодирования информации, позволяющее контролировать ее целостность. 3. Введение избыточности в процесс обработки информации, то есть использование аутентификации, позволяющее контролировать целостность файлов, сообщений и программ. Обзор используемых средств для защиты информации Витязь, основанная на использовании ГОСТ 28147-89, Криптон-Вето, так же использующая ГОСТ 28147-89 (стандарт цифровой подписи ГОСТ Р 34.10-94 и функции хеширования (ГОСТ Р 34.11-94). Подобные программы и системы довольно дорогостоящи и содержат чаще всего целые наборы пакетов, что не всегда является необходимым. Защита информации возможна как на программном, так и на аппаратном уровне. На аппаратном уровне возможно использование USB-ключей и смарт-карт для аутентификации пользователя. я. Хранение данных с плавающей точкой. Числа одинарной точности. Чтобы вычислить показатель степени необходимо из поля экспоненты вычесть смещение равное 01111111. Следовательно, получаем, что степень числа 01111100-01111111= - 00000011= -3. Далее видим, что в поле «мантисса» записано 01. Но, учитывая, что первая единица всегда отбрасывается, вычисляем: 1.01 2 3 101 2 5 5 2 5 0.15625 Числа двойной точности хранятся с использованием 64 бит, из которых 1 бит отвечает за знак, 11 бит за экспоненту и 52 бита за мантиссу. Код Хэмминга В последовательность информационных символов встраиваются проверочные биты следующим образом, где p(i) – контрольный бит, d(i) – информационный бит. Представляемая информация в бите p(1) p(2) d(1) p(3) d(2) d(3) d(4) p(4) d(5) d(6) Кодируемое слово P(1) 1 P(2) 0 0 1 0 1 0 P(3) 0 1 1 0 1 0 1 1 0 1 0 P(4) Кодовое слово с контрольными разрядами 1 0 0 0 1 1 0 0 d(7) 1 1 0 1 0 1 0 1 0 1 0 1 Код CRC (Cyclic Redundancy Code) При кодировании вычисляется контрольная сумма информационного блока и при декодировании проверяется соответствие проверочных символов полученной информации. Вычисление контрольной суммы реализовано следующим образом: заполняется матрица, первой строкой которой является информационный блок, последующие строки заполнены циклом де Брейна, для второй строки сдвинутым на одну позицию, для третьей на две позиции, для четвертой на две. Таким образом контрольная сумма будет равна операции Xor тех столбцов, над которыми в информационной строке расположена 1. В случае, представленном на изображении контрольная сумма равна 010^101^011^111^110 = 101. Рекуррентный код Финка При помощи данного кода в поток информационных символов помещаются значения корректирующих битов таким образом, что между каждыми двумя битами данных помещается один корректирующий. В случае неправильного приема корректирующего символа соотношение в кодовой последовательности не будет выполнено для i=k. В случае же ошибочного приема информационного символа, данное соотношение не будет выполняться при двух значениях k, при k =i–s–1 и при k=i+s. Код Рида-Соломона Поле Галуа Рассмотрим в качестве примера, как производится перемножение чисел в поле Галуа. Пусть нам необходимо найти произведение двух чисел, 213 и 30. 213 = 11010101, 30 = 11110 1 x 7 1 x 6 0 x 5 1 x 4 0 x 3 1 x 2 0 x 11 x 7 x 6 x 4 x 2 1 1 x 4 1 x 3 1 x 2 1 x 0 1 x 4 x 3 x 2 x ( x 7 x 6 x 4 x 2 1) x x 8 x 7 x 5 x 3 x В случае, если результат умножения выходит за границы 8 разрядов, то производится XOR с числом 285(11D) ( x 8 x 7 x 5 x 3 x) xor ( x 8 x 4 x 3 x 2 1) x 7 x 5 x 4 x 2 x 1 7 6 5 4 В итоге, результатом будет x x x x x 1 То есть получаем, что 213*30=243. Код Рида-Соломона. Кодирование. Декодирование. 209 235 238 226 238 Пусть необходимо зашифровать «Слово». В таком случае информационное слово можно представить в виде полинома: M ( x) 209 x 4 235x 3 238x 2 226 x 238 Далее вычисляется порождающий полином g(x), при делении на который, мы и получим информационный символ. 2t 4 3 2 g ( x) ( x 2 i ), g ( x) x 30 x 216 x 231x 116 i 1 Таким образом мы получим остаток от деления 132 x 3 107 x 2 255 x 1 Следовательно, закодированное сообщение можно представить : 209 235 238 226 238 132 107 255 1 При декодировании в первую очередь вычисляются четыре переменных: s1 a1 2 8 a 2 2 7 a3 2 6 a 4 2 5 a5 2 4 a6 2 3 a7 2 2 a8 21 a9 s 2 a1 216 a 2 214 a3 212 a 4 210 a5 2 8 a6 2 6 a7 2 4 a8 2 2 a9 s3 a1 2 24 a 2 2 21 a3 218 a 4 215 a5 212 a6 2 9 a7 2 6 a8 2 3 a9 s 4 a1 2 32 a 2 2 28 a3 2 24 a 4 2 20 a5 216 a6 212 a7 2 8 a8 2 4 a9 Разработка библиотек. Методы библиотек. 1. static float * Store(float * Ar, int sz) Метод, реализующий дублирование информации путем выделения области памяти соответственно кодируемому объему данных, а затем их копирование. 2. static int * Coder(float * Br, int siz) Метод, реализующий кодирование массива. Как и первый, данный метод получает указатель на массив, и его размер для кодирования. Возвращается указатель на новый массив, с закодированным сообщением. 3. static bool Check(int * Lp, int Rz) При помощи данного метода можно проверить правильность хранения информации. В том случае, если информация корректна, возвращается «0», в случае же когда информация повреждена, возвращается «1». 4. static float * Recovery(int * Lp, int Rz) В случае, если при проверки информации нами была получена «1», можно вызвать данный метод, который реализует восстановление информации. По выполнении декодирования мы получаем указатель на массив, содержащий полностью восстановленную информацию. Дублирование Дублирование в библиотеках реализовано при помощи выделения области памяти необходимого размера под копируемый туда массив памяти. float * Yt = new float[size]; Вызов данной функции, как уже было сказано ранее, осуществляется при помощи метода Store(float * Ar, int sz). Сравнение реализованных кодов Реализованные коды сравнивались между собой по быстродействию, избыточности кода, по количеству ошибочно принятых символов, которые код может обнаружить и количеству ошибок, которые он может исправить. Код Хэмминга Код Финка CRC-код Код Рида-Соломона N=100.000 В% Код./Декод. (сек.) Кодирование (сек.) соотнош. 0.51 0.20 1 0.64 0.22 1.25 0.75 0.34 1.47 9.25 1.53 18.14 T N Избыточность (%) k P Код Хэмминга 2 1 18.75 32 бит 6 бита СRC-код. 2 - 9.75 32 бит 3 бита Рекуррентный код Финка 1 1 100 32 бит 32 бит Код Рида-Соломона 3 2 33 8 байт 4 байта Выводы Мной было реализовано всего четыре библиотеки для контроля целостности данных применительно к программам сбора и обработки измерительной информации, с использованием различных методов кодирования: код Хэмминга, код Финка, код Рида-Соломона и CRC код. Программно реализовав данные методы на языке Си, было проведено сравнение данных кодов по быстродействию, по возможности восстановления ошибок и их обнаружения, применительно к информации, содержащей числовые данные с плавающей точкой. Наиболее целесообразным является использование кода РидаСоломона, несмотря на то, что кодирование при помощи данного метода занимает больше времени.