- •153003, Г. Иваново, ул. Рабфаковская, 34
- •Введение
- •Лабораторная работа №1. Шифрование простой подстановкой и перестановкой. Генераторы псевдослучайных чисел, гаммирование
- •Перестановки
- •Обратимые операции
- •Гаммирование
- •Задания
- •Лабораторная работа №2. Дешифрование, частотный анализ. Маскировка длины символа Дешифрование
- •Частотный анализ
- •Маскировка длины символа
- •Выполнение битовых операций
- •Сжатие методом Хаффмана
- •Задания
Маскировка длины символа
Чтобы усложнить задачу криптоаналитиков, для изменения длины каждого символа применяют сжатие. Для тех же целей иногда зашифрованный текст по определеному закону «разбавляют мусором», а при расшифровании этот «мусор» по этому же закону «выбрасывается».
Выполнение битовых операций
Для выполнения заданий по данной лабораторной работе могут потребоваться операции с битами. Ниже приводятся некоторые простейшие манипуляции с битами на языке Pascal.
Младший (самый правый) разряд считается нулевым.
1. Выделить i-й бит из переменной A:
(A shr i) AND $01.
Распечатать содержимое переменной A как последовательность битов:
for i:=7 downto 0 do
write ((A ShR i) AND $01).
2. Установить i-й бит
а) в 1: A OR ($01 ShL i);
б) в 0: A AND NOT ($01 ShL i).
3. Обнулить A:
A XOR A.
4. Поменять местами i-й и j-й биты целого числа:
type bitik = 0..14;
bin = 0..1;
var i,J : bitik;
bi,bj : bin;
X,a,ap: Integer;
…
bi:=(a ShR i) AND $01; bj:=(a ShR J) AND $01;
if bi<>bj then
if bi=1
then begin ap:=a-(1 ShL i); ap:=ap+(1 ShL j) end
else begin ap:=a-(1 ShL j); ap:=ap+(1 ShL i) end;
5. Циклический сдвиг содержимого n-разрядной переменной A на i битов
а) влево: ROL (A, i) или (A shl i) OR (A shr (n-i));
б) вправо: ROR (A, i) или (A shr i) OR (A shl (n-i)).
Сжатие методом Хаффмана
При сжатии этим методом 8-битовый код каждого символа заменяется на код, у которого разрядность зависит от частоты встречаемости данного символа.
Допустим, алфавит, для которого мы хотим применить сжатие, содержит всего шесть символов. Возьмем файл с текстом из этих символов и подсчитаем, сколько раз каждый символ встретился в этом файле. Отсортируем символы по возрастанию их встречаемости в тексте.
R N O A T E
5 6 7 8 9 13
Возьмем два символа с наименьшей частотой: R (5) и N (6). Сформируем из узлов R и N новый узел, частота вхождения для которого будет равна сумме частот R и N (11). После этого снова ищем два узла с самыми низкими частотами вхождения, исключая из просмотра R и N и рассматривая вместо них новый узел с суммарной частотой вхождения. И так продолжаем до тех пор, пока не получим вершину дерева с общим количеством символов. В результате получится дерево для генерации кодов (рис. 3).
Рис. 3. Дерево кодов для сжатия по методу Хаффмана
Спускаясь по дереву из корневого узла до терминального символа, мы пишем 0, если проходим по левой ветви, и пишем 1 – если по правой. Таким образом для символов нашего алфавита получим следующие коды:
E – 11 |
А – 101 |
N – 001 |
Т – 01 |
O – 100 |
R – 000 |
Для наиболее часто встречающихся символов мы получили более короткие коды. Сжатый файл вместо 48 байт будет занимать 16 байт [(53+63+73+83+92+132) / 8].
Задания
Напишите программу дешифрования зашифрованного по методу моноалфавитной подстановки текста (см. задание №1, лаб. работы №1), использующую частотный анализ встречаемости букв и пар букв заданного алфавита. Программа должна выдавать несколько наиболее вероятных результатов дешифрования для дальнейшей оценки.
Напишите программу частотного анализа встречаемости символов и пар символов.
Проведите частотный анализ для алфавитов английского языка:
"_", "A", …, "Z"
"_", "A", …, "Z", "a", ..., "z", "0", …, "9", "(", ")", "[", "]", "{", "}", ".", ",", ":", ";", "?", "!", "-", """, "+", "=", "№", "%", "*", "/"
все символы с кодами от 0 до 255.
Результаты анализа должны быть записаны в текстовый файл, в каждой строчке которого был записан символ (или пара символов) и через пробел частота в процентах. Строки должны быть отсортированы "по убыванию" частоты встречаемости (отдельно для символов и для 20 наиболее часто встречающихся пар символов.
Вычислите индекс соответствия для нескольких больших файлов текста на русском и английском языках, с учетом регистра букв и без учета. Если в текстовом файле встретится символ, который не входит в исследуемый алфавит, то его не нужно учитывать при подсчитывании N.
Проведите частотный анализ встречаемости символов и пар символов (условия см. задание №2) для алфавитов русского языка:
"_", "А", …, "Я"
"_", "А", …, "Я", "а", ..., "я", "0", …, "9", "(", ")", "[", "]", "{", "}", ".", ",", ":", ";", "?", "!", "-", """, "+", "=", "№", "%", "*", "/"
все символы с кодами от 0 до 255.
Напишите программу, генерирующую подпрограммы для шифрования и расшифрования текстовых файлов, использующих монофонический шифр. Монофонический шифр представляет собой многоалфавитный шифр подстановки, уравнивающий частоту появления зашифрованных знаков. Для знаков, встречающихся часто, назначается относительно большое количество подстановочных знаков. В то же время для нечасто используемых исходных знаков может оказаться достаточным одного или двух знаков подстановки. При шифровании знаки подстановки для одного и того же знака в исходном тексте выбираются по очереди циклически.
На вход программы подается текстовый файл с алфавитом и большой текстовый файл для частотного анализа. На выходе должна получаться таблица подстановочного шифра, используемого в дальнейшем процедурами шифрования и расшифрования.
Проведите частотный анализ встречаемости символов для алфавитов:
"_", "А", …, "Я"
"_", "A", …, "Z",
соответственно в русских и английских текстах без учета регистра, и сгенерируйте шифры. Проверьте работу процедур шифрования и расшифрования. Проведите частотный анализ для зашифрованных таким методом текстов.
Напишите программу вычисления индекса соответствия текстов. Проведите вычисления ИС для нескольких больших текстовых файлов английского языка.
Используя программы шифрования и расшифрования методом многоалфавитной подстановки (см. задание №3), вычислите ИС для зашифрованных текстов при длине ключа от 1 до 15 знаков.
Напишите программы шифрования и расшифрования с использованием тюремной азбуки. Азбука устроена следующим образом: в прямоугольную матрицу 6 х 5 вписываются по строкам буквы русского алфавита в обычном порядке следования, кроме букв ё, й, ъ. Код каждой буквы теперь можно определить парой чисел – номером строки и столбца. Для каждого числа используйте по три бита. Для обозначения пробела – 000. Оставшиеся в конце закодированного сообщения биты заполните нулями.
Напишите программы сжатия и развертывания текстов по принципу замены наиболее часто встречающихся символов более короткими кодами, предложенному Хаффманом. Пусть тексты состоят только из заглавных букв русского алфавита и пробелов.
Для английского алфавита коды Хаффмана могут быть следующие:
A |
1111 |
G |
00001 |
M |
00011 |
S |
0110 |
Y |
00000 |
B |
011100 |
H |
0101 |
N |
1100 |
T |
001 |
Z |
1101000100 |
C |
01000 |
I |
1010 |
O |
1110 |
U |
00010 |
|
|
D |
11011 |
J |
110100000 |
P |
110101 |
V |
1101001 |
|
|
E |
100 |
K |
110100011 |
Q |
1101000101 |
W |
011101 |
|
|
F |
01001 |
L |
01111 |
R |
1011 |
X |
110100001 |
|
|
Напишите программы шифрования и расшифрования с использованием азбуки Морзе (русского варианта), в которой точки заменены битом 1, а тире – 0.
А-10 |
Б–0111 |
В–100 |
Г–001 |
Д–011 |
Е–1 |
Ж–1110 |
З–0011 |
И–11 |
Й-1000 |
К–010 |
Л–1011 |
М–00 |
Н–01 |
О-000 |
П-1001 |
Р-101 |
С-111 |
Т-0 |
У-110 |
Ф-1101 |
Х-1111 |
Ц-0101 |
Ч-0001 |
Ш-0000 |
Щ-0010 |
Ы-0100 |
ЪЬ-0110 |
Э-11011 |
Ю-1100 |
Я-1010 |
|
1-10000 |
2-11000 |
3-11100 |
4-11110 |
5-1111 |
6-01111 |
7-00111 |
8-00011 |
9-00001 |
0-00000 |
[.]-111111 |
[,]-101010 |
[:]-000111 |
[;]-01010 |
[!]-001100 |
["]-101101 |
[()]-010010 |
[-]-011110 |
[/]-01101 |
|
Начало-011001 |
Конец-10101 |
Перед кодом каждого символа необходимо вставлять по три бита, в которых будет храниться длина кода символа в битах. Оставшиеся в конце закодированного сообщения биты заполните нулями. Для разделения отдельных слов используйте код – 10001.
Напишите программы шифрования и расшифрования методом перестановки битов в группе из 4 битов открытого (зашифрованного) текста. Все возможные перестановки битов хранятся в массиве. Например: 0-1234, 1-2134, 2-3214, 3-4231, 4-1324, 5-1432, 6-1243 и т. д. Индекс используемой последовательности битов задается числом, которое выдается генератором ПСЧ. Открытый текст и зашифрованный текст должны находиться в текстовых файлах.
Напишите программы шифрования и расшифрования методом циклического сдвига. Каждая порция открытого текста состоит из m блоков. Каждый блок, состоящий из n байт, сдвигается влево (при расшифровании вправо) на k0, k1, …, km-1 битов соответственно. Проверьте работу программ при m=3, n=4 и K=11,5,9.
Напишите программы шифрования и расшифрования методом подстановки, используя квадрат Полибия [8x8] для русского алфавита ("_", "А", … , "Я", "0", …, "9", "(", ")", "[", "]", "{", "}", ".", ",", ":", ";", "?", "!", "-", """, "+", "=", "№", "%", "*", "/"). В квадрат по строкам последовательно вписываются все символы алфавита. Каждый символ открытого текста кодируется парой чисел – номером строки и номером столбца. Для кодирования номера строки и номера столбца используются по 3 бита. Открытый текст храните в текстовом файле. Строчные буквы русского алфавита заменяйте на прописные.
Р
еализуйте
программно генератор последовательности
битов (регистр сдвига), изображенный
на рис. 4.
Рис. 4. Генератор битовой последовательности
Генерация кодирующей последовательности битов производится циклически из небольшого начального объема информации – ключа (10000) по следующему алгоритму. Из текущего набора битов выбираются значения определенных разрядов (0-го и 3-го) и складываются по XOR между собой. Все разряды сдвигаются на 1 бит, а только что полученное значение (0 или 1) помещается в освободившийся самый младший разряд. Значение, находившееся в самом старшем разряде до сдвига, добавляется в кодирующую последовательность, становясь очередным ее битом. Очередной бит кодирующей последовательности складывается по XOR с очередным битом исходного потока. В результате получается очередной бит зашифрованной информации.
Определите, на каком шаге генерируемая последовательность начнет повторяться?
Напишите программы поточного шифрования и расшифрования методом гаммирования, используя полученный регистр сдвига для выработки гаммы шифра.
Напишите программу дешифрования текста, зашифрованного методом перестановки битов в каждом байте, если известно, что открытый текст должен начинаться с известной подстроки, например: "Совершенно секретно".
Напишите программы шифрования и расшифрования с использованием файла с ключевым текстом, который будет использоваться следующим образом: очередной символ исходного текста ищется в ключевом тексте; смещение от текущей позиции файла до позиции с найденным символом и будет кодом зашифрованного символа. Поиск следующего символа начнется от только что найденного. По достижении конца ключевого файла поиск продолжите с начала файла.
Есть ли возможность дешифровать с помощью статистических методов зашифрованный таким образом текст? Открытый, ключевой и зашифрованный тексты должны находиться в текстовых файлах.
Напишите программы шифрования и расшифрования с использованием метода Дика Френдберга, выпускника университета Беркли. Этот метод комбинирует многоалфавитную подстановку с генератором псевдослучайных чисел для получения шифра подстановки с характеристиками “бесконечного ключа”.
Алгоритм метода:
1). Установить генератор псевдослучайных чисел с заданным порождающим числом R0. Установить список подстановки из n знаков.
2). Определить, есть ли еще какие-либо символы открытого (зашифрованного) текста, которые необходимо зашифровать (расшифровать)? Если нет, то ОСТАНОВ.
3). Определить место (a) следующего символа открытого (зашифрованного текста) в исходном алфавите (списке подстановки). Подставить вместо него соответствующий знак из списка подстановки (первоначального исходного алфавита).
4). Сгенерировать псевдослучайное число R в интервале от 1 до n.
5). Переставить R-й и a-й знаки в исходном алфавите.
6). Перейти к пункту 2.
Постройте диаграммы частотного распределения зашифрованного текста для сообщения, состоящего из 100, 1000 и 10000 пробелов.
Напишите программы шифрования и расшифрования методом двойного ключа, где два периодических ключа длиной в 125 и 123 слова добавляются по модулю 2 к исходному тексту. С каждым i‑м словом открытого текста (из первых 123 слов) складываются первое слово первого ключа и i-ое слово второго ключа, то есть получается что-то вроде шифрования с одним ключом длиной, равной произведению длин двух ключей (в нашем случае 125 х 123 = 15375 слов). Открытый текст, каждый из ключей и зашифрованный текст должны находиться в текстовых файлах.
Напишите программы шифрования и расшифрования методом «Сигнатура». Алгоритм зашифрования заключается в преобразовании (с помощью байтов ключа) битов входной последовательности в выходную последовательность битов:
В текущий байт B помещается синхропосылка S, а в текущий байт ключа K помещается первый байт из файла содержащего ключевую информацию.
Текущий байт B складывается с текущим байтом ключа K с помощью операции XOR (рис. 5).
Подсчитывается сумма битов (по модулю 2) полученного байта, т.е. все биты байта складываются по правилу 1+1=0, 1+0=1, 0+1=1, 0+0=0 так, чтобы в результате получился один бит.
Полученный бит складывается со следующим битом файла открытого текста (входного потока).
Левый бит текущего байта B записывается в выходной поток, и весь текущий байт сдвигается влево на один бит. Вместе с ним сдвигается и текущий байт ключа K.
На освободившийся правый бит в текущем байте B записывается бит, полученный в пункте 3, а на освободившийся правый бит в текущем байте ключа K записывается очередной бит из файла ключевой информации.
И так продолжается до тех пор, пока не закончится входная последовательность.
Открытый текст, ключ и зашифрованный текст должны находиться в текстовых файлах.
Рис. 5. Генератор битовой последовательности
Напишите программу помещения (извлечения) содержимого текстового файла в тело (из тела) графического файла. Для этого можно использовать метод последнего значащего бита (Lasst Significant Bit, LSB). Например, полноцветные файлы в формате RGB кодируют каждый пиксел тремя байтами для представления соответственно красной, зеленой и синей составляющих. Изменение каждого из трех младших битов (для записи битов скрываемого сообщения) приведет к изменению цвета данной точки менее чем на 1%, что абсолютно незаметно. Таким образом в файле размером 800 килобайт можно скрыть сообщение размером до 100 килобайт. Методы направленные на скрытие самого присутствия конфиденциальной информации называются стеганографией.
Напишите программы перевода произвольного файла в формат Base64 и обратно. Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма (транспортное кодирование). Для того, чтобы преобразовать данные в base64, первый байт помещается в самые старшие восемь бит 24-битного буфера, следующие в средние восемь и третий в младшие значащие восемь бит. Если кодируется менее чем три байта, то соответствующие биты буфера устанавливаются в ноль. Далее каждые шесть бит буфера, начиная с самых старших, используются как индексы строки «ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/» и её символы, на которые указывают индексы, помещаются в выходную строку. Если кодируются только один или два байта, используются только первые два или три символа строки и выходная строка дополняется двумя или одним символами «=». Это предотвращает добавление дополнительных битов к восстановленным данным. Процесс повторяется над оставшимися входными данными.
Было получено следующее сообщение, закодированное кодом Хемминга (7,4):
0x0E750FF62BD8A8
При передаче в некоторых битах сообщения появились ошибки.
Напишите программы кодирования и декодирования по методу Хемминга. Декодируйте приведенный в задании текст с автоматическим исправлением ошибок.
Коды Хемминга относятся к самокорректирующиеся кодам. Если во время передачи данных произошли ошибки, то при приеме эти ошибки автоматически будут исправлены.
Построение кодов Хемминга основано на принципе проверки на четность числа единичных символов (битов): к последовательности добавляется элемент такой, чтобы число единичных символов в получившейся последовательности было четным. r1 = i1 i2 … ik, знак здесь означает сложение по модулю 2.
То есть к проверочным битам (i) добавляется необходимое количество контрольных битов (r). Для кода Хемминга (7,4): 7 - количество элементов последовательности, 4 - количество проверочных символов.
Для классического кода Хемминга (7,4) контрольные биты:
r1 = i1 i2 i3; r2 = i2 i3 i4; r3 = i1 i2 i4.
Кодовые слова кода Хемминга (7,4):
i1 |
i2 |
i3 |
i4 |
r1 |
r2 |
r3 |
|
|
i1 |
i2 |
i3 |
i4 |
r1 |
r2 |
r3 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
|
|
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
|
|
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
|
|
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
|
|
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
|
|
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|
|
1 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
|
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
При приеме последовательности вычисляется синдром S = (s1, s2, s3):
s1=r1i1i2i3; s2=r2i2i3i4; s3=r3i1i2i4.
Если синдром отличен от 000, то возможно при передаче последовательности один бит был передан неверно.
Синдром |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
Ошибка в символе |
нет ошибки |
r3 |
r2 |
i4 |
r1 |
i1 |
i3 |
i2 |
Зная в каком бите произошла ошибка, можно его заменить на противоположный и таким образом автоматически исправлять однократные ошибки.
Если в последовательности были переданы неправильно 2 и более бит (что маловероятно), то автоматическое исправление будет работать неверно.
