Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Установочные лекции (Амелин).doc
Скачиваний:
6
Добавлен:
21.08.2019
Размер:
1.31 Mб
Скачать

6. Описать (с помощью блок-схемы, перечисления последовательности шагов, псевдокода) и объяснить процесс шифрования/дешифрования произвольного файла с помощью алгоритма асимметрического шифрования

В алгоритмах шифрования с открытым ключом каждый пользователь имеет пару ключей, связанных друг с другом некоторой зависимостью. Ключи обладают свойством: текст, зашифрованный одним ключом, может быть расшифрован только с помощью парного ему ключа. Один ключ называется секретным (закрытым) ключом. Пользователь хранит свой секретный ключ в надежном месте и никому его не передает. Второй ключ называется открытым ключом, и пользователь, напротив, сообщает его всем желающим (а также может опубликовать в любом общедоступном источнике).

Если пользователь A хочет отправить зашифрованное послание пользователю B, он шифрует его с помощью открытого ключа B. Теперь текст не сможет прочесть никто, кроме B (даже сам A), поскольку для дешифрования нужен закрытый ключ.

Схему шифрования можно записать в следующем виде:

M' = E(M, Kоткр)

M = D(M', Kзакр),

где Е — функция шифрования (encrypt), D — функция дешифрования (decrypt), а Kоткр и Kзакр — соответственно открытый и закрытый ключи получателя сообщения.

7. Составить программу (псевдокод), реализующую простейший алгоритм вычисления контрольной суммы (цифровой подписи) произвольного файла

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

Простейший алгоритм подсчета контрольной суммы произвольного файла заключается в побитовом сложении всех его битов (по модулю 2, т. е. 11 = 0, 0 = 0, 1 = 1, 01 = 1).

Программа на псевдокоде будет выглядеть примерно так:

sum := 0;

for i = 0 to bit_length(file) sum := sum get_bit(file, i);

// здесь предполагается, что функция bit_length(file) возвращает количество бит в файле file, а функция get_bit(file, i) возвращает i-й бит файла file.

8. Из двух строк (последовательностей) символов выделить сигнатуру максимальной длины. Рассказать об основных подходах к выбору сигнатур в антивирусах для поиска деструктивных программ.

Рассмотрим методы обнаружения антивирусом своих жертв.

Обнаружение, основанное на сигнатурах — метод работы антивирусов и систем обнаружения вторжений, при котором антивирус, просматривая файл (или передаваемый по сети пакет), обращается к словарю, в котором содержатся сигнатуры известных атак или вирусов. Под сигнатурой понимается фрагмент кода, однозначно идентифицирующий вирус. Например, вирус Email-Worm.Win32.Happy содержит строку «Happy New Year 1999 !!», которая с низкой вероятностью может встретиться в другой программе.

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

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

Программа, выделяющая сигнатуру максимальной длины в двух строках, получает на вход две строки str1 и str2, после чего просматривает все возможные фрагменты строки str1 (сначала подстроки разной длины, начинающиеся с первого символа, затем подстроки, начинающиеся со второго символа и т. д., т. е. используются два вложенных цикла). Каждая из этих подстрок проверяется на пример вхождения в str2. Если вхождение существует, проверяется длина подстроки и если она больше ранее запомненной, эта подстрока запоминается вместе со своей длиной. Результатом работы программы будет самая длинная из найденных подстрок.

len := 0; {изначально максимальная длина подстроки – 0}

signature := “”

for i = 1 to length(str1) – 1 do

for j = i +1 to length(str1) do begin

substr := copy (str1, i, j);

if pos(substr, str2) > 0 then

if length(substr) > len then begin

signature := substr;

len := length(substr);

end;

end;

{результатом является подстрока signature}