logo search
All_lections

4.4 Контроль целостности программной структуры в процессе эксплуатации

Контроль целостности программ и данных выполняется одними и теми же методами. Исполняемые программы изменяются крайне редко на этапе их эксплуатации. Существует достаточно широкий класс программ, для которых все исходные данные или их часть также изменяются редко. Поэтому контроль целостности таких файлов выполняется так же, как и контроль программ.

Контроль целостности программных средств и данных осуществляется путем получения (вычисления) характеристик и сравнения их с контрольными характеристиками. Контрольные характеристики вычисляются при каждом изменении соответствующего файла. Характеристики вычисляются по определенным алгоритмам. Наиболее простым алгоритмом является контрольное суммирование. Контролируемый файл в двоичном виде разбивается на слова, обычно состоящие из четного числа байт. Все двоичные слова поразрядно суммируются с накоплением по mod2, образуя в результате контрольную сумму. Разрядность контрольной суммы равняется разрядности двоичного слова. Алгоритм получения контрольной суммы может отличаться от приведенного, но, как правило, не является сложным и может быть получен по имеющейся контрольной сумме и соответствующему файлу.

Другой подход к получению характеристик целостности связан с использованием циклических кодов. Суть метода состоит в следующем. Исходная двоичная последовательность представляется в виде полинома F(x) степени n-1, где n - число бит последовательности. Для выбранного порождающего полинома P(x) можно записать равенство:

где m - степень порождающего полинома,

G(x) - частное, а R(x) - остаток от деления F(x)∙xm на Р(x),

- сложение по модулю 2 (исключающее «ИЛИ», XOR, «сумма по модулю 2»).

Из приведенного соотношения можно получить новое выражение:

Из последнего выражения можно сделать вывод:

если исходный полином увеличить на хm (сдвинуть в сторону старших разрядов на m разрядов) и сложить с остатком R(х) по модулю 2, то полученный многочлен разделится без остатка на порождающий полином Р(х).

При контроле целостности информации контролируемая последовательность (сектор на диске, файл и т. д.), сдвинутая на m разрядов, делится на выбранный порождающий полином, и запоминается полученный остаток, который называют синдромом. Синдром хранится как эталон. При контроле целостности к полиному контролируемой последовательности добавляется синдром и осуществляется деление на порождающий полином. Если остаток от деления равен нулю, то считается, что целостность контролируемой последовательности не нарушена. Обнаруживающая способность метода зависит от степени порождающего полинома и не зависит от длины контролируемой последовательности. Чем выше степень полинома, тем выше вероятность определения изменений d, которая определяется из соотношения: d =1/2m.

Использование контрольных сумм и циклических кодов, как и других подобных методов, имеет существенный недостаток. Алгоритм получения контрольных характеристик хорошо известен, и поэтому злоумышленник может произвести изменения таким образом, чтобы контрольная характеристика не изменилась (например, добавив коды).

Задача злоумышленника усложнится, если использовать переменную длину двоичной последовательности при подсчете контрольной характеристики, а характеристику хранить в зашифрованном виде или вне АС (например, в ЗУ Touch Memory).

Рассмотрим пример использования циклических кодов для контроля целостности двоичной последовательности.

Пусть требуется проконтролировать целостность двоичной последовательности А=1010010. Используется порождаемый полином вида: Р(х)=х3+х+1.

А. Получение контрольной характеристики.

GА(х) = 1∙х6+0∙х5+1∙х4+0∙х3+0∙х2+1∙х1+0∙х0 = x64+х.

GA(х)∙х3 = х974.

При вычислении синдрома RA(х) действия выполняются по правилам деления полиномов, заменяя операцию вычитания операцией сложения по модулю:

Двоичная последовательность с синдромом имеет вид:

А' = 1010010011 (синдром подчеркнут). Последовательность А' хранится и(или) передается в АС.

Б. Контроль целостности информации.

Если изменений последовательности А' = 1010010011 не произошло, то соответствующий ей полином должен разделиться на порождающий полином без остатка:

Результат произведенных вычислений свидетельствует о целостности информации.

Если синдром отличен от нуля, то это означает, что произошла ошибка при хранении (передаче) двоичной последовательности. Ошибка определяется и в контрольных разрядах (в синдроме).

Существует метод, который позволяет практически исключить возможность неконтролируемого изменения информации в АС. Для этого необходимо использовать хэш-функцию. Под хэш-функцией понимается процедура получения контрольной характеристики двоичной последовательности, основанная на контрольном суммировании и криптографических преобразованиях. Алгоритм хэш-функции приведен в ГОСТ Р34.11-94. Алгоритм не является секретным, так же как и алгоритм используемого при получении хэш-функции криптографического преобразования, изложенного в ГОСТ 28147-89.

Исходными данными для вычисления хэш-функции являются исходная двоичная последовательность и стартовый вектор хеширования. Стартовый вектор хеширования представляет собой двоичную последовательность длиной 256 бит. Он должен быть недоступен злоумышленнику. Вектор либо подвергается зашифрованию, либо хранится вне АС.

Итерационный процесс вычисления хэш-функции Н предусматривает:

В результате получается хэш-функция длиной 256 бит. Значение хэш-функции можно хранить вместе с контролируемой информацией, т. к., не имея стартового вектора хеширования, злоумышленник не может получить новую правильную функцию хеширования после внесения изменений в исходную последовательность. А получить стартовый вектор по функции хеширования практически невозможно.

Для каждой двоичной последовательности используются две контрольные характеристики: стартовый вектор и хэш-функция. При контроле по стартовому вектору и контролируемой последовательности вычисляется значение хэш-функции и сравнивается с контрольным значением.