Главная страница

Задание 2 Лаб работа вариант 5. Вариант 5 Задание


Скачать 21.49 Kb.
НазваниеВариант 5 Задание
Дата13.06.2022
Размер21.49 Kb.
Формат файлаdocx
Имя файлаЗадание 2 Лаб работа вариант 5.docx
ТипДокументы
#587325

Вариант 5

Задание:

Написать программу шифрования и дешифрования сообщения, используя древнеспартанский шифр "скитала".

Спартанцы заметили, что если полоску пергамента намотать спирально на палочку и написать на нем вдоль палочки текст сообщения, то после снятия полоски буквы в ней расположатся хаотично. Этот эффект можно получить, если записывать буквы не подряд, а через условленное число по кольцу до тех пор, пока весь текст не будет исчерпан. Сообщение ВЫСТУПАЙТЕ при окружности палочки в 3 буквы даст шифровку ВУТЫПЕСАТЙ.

Решение:

Слово «скитала», используемое для названия шифра, произошло от древнегреческого сцитала, что переводится, как жезл. Такое шифрование относится к типу перестановочных. Авторство изобретения этого способа кодирования текста криптография отдаёт Древней Спарте.

Способ кодировки

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

Для прочтения полоска античной бумаги наматывалась на жезл плотно, виток к витку. Намотка должна была осуществляться так, чтобы между соседними витками не оставалось никакого промежутка. В то же время витки не должны были накладываться друг на друга. Только в этом случае достигалась полная идентичность написанного и читаемого текстов.

Далее читалась строка вдоль длины получившегося цилиндра. Затем палочка поворачивалась на определённый угол и читалась следующая строка. Полностью сообщение считывалось при полном обороте жезла, являвшегося частью шифра «скитала». Чтобы передаваемое сообщение без искажений уяснялось принимающей стороной. Адресант и адресат должны были иметь жезл одинаковой длины и диаметра.

Кроме «стандартизованных» размеров скиталы постоянную величину должен был иметь шрифт и ширина пергаментной полоски. Только в этом случае написанный текст одинаково изображался и читался на любом стандартном жезле.

Процесс шифрования заключался в перемене мест исходного текста в соответствии с буквенной ёмкостью диаметра дешифровального приспособления.

Ограниченные размеры жезла предъявляли определённые требования к длине сообщения. Оно не могло превосходить максимально возможной длины, равной произведению количества букв вдоль окружности скиталы на число витков, укладывающихся в её длине.

Например, если окружность вмещает 5 символов, а длина 9 витков, максимальная длина текста составит 45 символов. Если требуется передать больше информации, нужно намотать следующий участок полоски или использовать ещё одну.

#include

#include

#include

#include

using namespace std;

int main() {

char *source_text;

char *ciphertext; // "матрица" Сциталла

int symbol_amount; // кол-во символов в сообщении

int string_amount; // кол-во строк

int colum_amount; // кол-во столбцов

int index; // индекс буквы зашифрованного сообщения

int file_length; // сколько символов считать из файла

ifstream fin("message.txt");

if (!fin.is_open()) // если файл не открыт

cout << "Файл не может быть открыт!\n"; // сообщить об этом

else {

cout << "Сколько символов считать из файла? " << endl;

cin >> file_length;

source_text = new char[file_length];

fin.getline(source_text, file_length); // считали строку из файла

cout << endl << "Сообщение: " << endl;

for (int i = 0; i < file_length; i++) {

cout << source_text[i];

}

cout << endl;

fin.close(); // закрываем файл

}

symbol_amount = file_length;

ciphertext = new char[symbol_amount];

cout << endl; cout << "Введите ключ Скиталла: ";

cin >> string_amount;

colum_amount = ((symbol_amount - 1) / string_amount) + 1; // вычислили кол-во столбцов

cout << "Кол-во символов в сообщении: " << symbol_amount << endl;

cout << "Кол-во строк: " << string_amount << endl;

cout << "Кол-во столбцов: " << colum_amount << endl;

for (int i = 0; i < symbol_amount; i++) {

index = string_amount*(i%colum_amount) + (i / colum_amount);

ciphertext[index] = source_text[i];

}

for (int i = 0; i < symbol_amount; i++)

cout << ciphertext[i];

cout << endl;

delete []ciphertext;

delete []source_text;

}

«Сатнызмтл, чоел оок егмнанмтт прлн аплчуинпст анмвоьплчитктсощня опсесяи оок ув е аплжтяхоин.Эо фетмжоплчт,ел аиыаьбкын орд ее солно ил оклц отхпр оавс ес ебдтичра.СощнеВСУАТ р кунсиплчив3бкыдс ирвуВТПСТ.прац аеии т сиплсупрает аоаьсиаьон аок аиаьн е дл аок ес обеи,т ол нтяплсибкывнйрсооас атчо ттэфк он оуиь сизпсвт ув епдя,ачрзулвенечсоп оьуд е о,пк еьтктн уе сепн обеи ЫТПЙЕпиоржот аок ув атшфок УЫЕАЙ»



написать администратору сайта