ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.06.2019
Просмотров: 444
Скачиваний: 3
Таблица Вижинера используется для зашифрования и расшифрования. Таблица имеет два входа:
• верхнюю строку подчеркнутых символов, используемую для считывания очередной буквы исходного открытого текста;
• крайний левый столбец ключа.
Последовательность ключей обычно получают из числовых значений букв ключевого слова.
При шифровании исходного сообщения его выписывают в строку, а под ним записывают ключевое слово (или фразу). Если ключ оказался короче сообщения, то его циклически повторяют. В процессе шифрования находят в верхней строке таблицы очередную букву исходного текста и в левом столбце очередное значение ключа. Очередная буква шифртекста находится на пересечении столбца, определяемого шифруемой буквой, и строки, определяемой числовым значением ключа.
Пусть ключевая последовательность имеет длину r, тогда ключ r-алфавитной подстановки есть r-строка
Система шифрования Вижинера преобразует открытый текст в шифртекст с помощью ключа согласно правилу
г де
Таблица Вижинера для английского алфавита
Таблица Вижинера для русского алфавита
Рассмотрим пример получения шифртекста с помощью таблицы Вижинера. Пусть выбрано ключевое слово АМБРОЗИЯ. Необходимо зашифровать сообщение ПРИЛЕТАЮ СЕДЬМОГО.
Выпишем исходное сообщение в строку и запишем под ним ключевое слово с повторением. В третью строку будем выписывать буквы шифртекста, определяемые из таблицы Вижинера.
Сообщение |
|
П |
Р |
И |
Л |
Е |
Т |
А |
Ю |
|
|
С |
Е |
Д |
Ь |
М |
О |
Г |
О |
Ключ |
|
А |
М |
Б |
Р |
О |
З |
И |
Я |
|
|
А |
М |
Б |
Р |
О |
З |
И |
Я |
Шифртекст |
|
П |
Ъ |
Й |
Ы |
У |
Щ |
И |
Э |
|
|
С |
С |
Е |
К |
Ь |
Х |
Л |
Н |
1.3 Шифр "двойной квадрат" Уитстона
В 1854 г. англичанин Чарльз Уитстон разработал новый метод шифрования биграммами, который называют "двойным квадратом". Свое название этот шифр получил по аналогии с по-либианским квадратом. Шифр Уитстона открыл новый этап в истории развития криптографии. В отличие от полибианского шифр "двойной квадрат" использует сразу две таблицы, размещенные по одной горизонтали, а шифрование идет биграммами, как в шифре Плейфейра. Эти не столь сложные модификации привели к появлению на свет качественно новой криптографической системы ручного шифрования. Шифр "двойной квадрат" оказался очень надежным и удобным и применялся Германией даже в годы второй мировой войны.
Поясним процедуру шифрования этим шифром на примере. Пусть имеются две таблицы со случайно расположенными в них русскими алфавитами. Перед шифрованием исходное сообщение разбивают на биграммы. Каждая биграмма шифруется отдельно. Первую букву биграммы находят в левой таблице, а вторую букву - в правой таблице. Затем мысленно строят прямоугольник так, чтобы буквы биграммы лежали в его противоположных вершинах. Другие две вершины этого прямоугольника дают буквы биграммы шифртекста.
Две таблицы со случайно расположенными символами русского алфавита для шифра "двойной квадрат"
Предположим, что шифруется биграмма исходного текста ИЛ. Буква И находится в столбце 1 и строке 2 левой таблицы. Буква Л находится в столбце 5 и строке 4 правой таблицы. Это означает, что прямоугольник образован строками 2 и 4, а также столбцами 1 левой таблицы и 5 правой таблицы. Следовательно, в биграмму шифртекста входят буква О, расположенная в столбце 5 и строке 2 правой таблицы, и буква В, расположенная в столбце 1 и строке 4 левой таблицы, т.е. получаем биграмму шифртекста ОВ.
Если обе буквы биграммы сообщения лежат в одной строке, то и буквы шифртекста берут из этой же строки. Первую букву биграммы шифртекста берут из левой таблицы в столбце, соответствующем второй букве биграммы сообщения. Вторая же буква биграммы шифртекста берется из правой таблицы в столбце, соответствующем первой букве биграммы сообщения. Поэтому биграмма сообщения ТО превращается в биграмму шифртекста ЖБ. Аналогичным образом шифруются все биграммы сообщения:
Сообщение ПР ИЛ ЕТ АЮ _Ш ЕС ТО ГО
Шифртекст ПЕ ОВ ЩН ФМ ЕШ РФ БЖ ДЦ
1.4 Оценка секретности шифра
Шифрование методом "двойного квадрата" дает весьма устойчивый к вскрытию и простой в применении шифр. Взламывание шифртекста "двойного квадрата" требует больших усилий, при этом длина сообщения должна быть не менее тридцати строк.
Шифрования Вернама является в сущности частным случаем системы шифрования Вижинера при значении модуля m = 2. Конкретная версия этого шифра, предложенная в 1926 г. Гилбертом Вернамом, сотрудником фирмы AT&T США, использует двоичное представление символов исходного текста.
Каждый символ исходного открытого текста из английского алфавита {А, В, С, D, ..., Z}, расширенного шестью вспомогательными символами (пробел, возврат каретки и т.п.), сначала кодировался в 5-битовый блок (b0, b1, …, b4)телеграфного кода Бодо.
Случайная последовательность двоичных ключей k0,k1,k2,... заранее записывалась на бумажной ленте.
Схема передачи сообщений с использованием шифрования методом Вернама показана ниже. Шифрование исходного текста, предварительно преобразованного в последовательность двоичных символов x, осуществлялось путем сложения по модулю 2 символов x с последовательностью двоичных ключей k.
Символы шифртекста
y = xk
Схема шифрования и расшифрования сообщений по методу Вернама
Расшифрование состоит в сложении по модулю 2 символов у шифртекста с той же последовательностью ключей k:
y k = x k k = x
При этом последовательности ключей, использованные при шифровании и расшифровании, компенсируют друг друга (при сложении по модулю 2), и в результате восстанавливаются символы x исходного текста.
При разработке своей системы Вернам проверял ее с помощью закольцованных лент, установленных на передатчике и приемнике для того, чтобы использовалась одна и та же последовательность ключей.
Следует отметить, что метод Вернама не зависит от длины последовательности ключей и, кроме того, он позволяет использовать случайную последовательность ключей. Однако при реализации метода Вернама возникают серьезные проблемы, связанные с необходимостью доставки получателю такой же последовательности ключей, как у отправителя, либо с необходимостью безопасного хранения идентичных последовательностей ключей у отправителя и получателя. Эти недостатки системы шифрования Вернама преодолены при шифровании методом гаммирования.
2 Разработка программного продукта
2.1 Современные требования к программным продуктам
Современные программные продукты должны обладать большими функциональными возможностями в области своего применения. Качественный программный продукт должен иметь удобный интерфейс, чтобы пользователю было легко работать с ним, иметь инструкцию по эксплуатации, справку работы с приложением.
2.2 Предполагаемая структура ЧП
2.3 Обоснование выбора средств реализации
Для решения данного задания мной был выбран язык программирования С++ и среда разработки Visual Studio. Эта среда разработки позволяет решать задания любой сложности и уровня, при этом не обязательно быть профессионалом, ведь среда разработки создана как для новичков, которые только начинают свою карьеру в программировании, так и для опытных людей, которые уже не один год в IT – сфере.
2.4 Функциональная схема ( блок-схема )
Work – переменная условия работы программы, пока work = 1 программа работает.
a – переменная условия шифрования/дешифрования, если a = 1 – программа шифрует
сообщение, если a = 0 – программа дешифрует сообщение.
2.5 Алгоритм реализации основной функции ЧП
Основной функцией ПП – шифрование и дешифрование текста с помощью двойного квадрата Уитстона.
После запуска ПП пользователь вводить сообщения для шифрования или дешифрования. После этого пользователь получает свой зашифрованный или расшифрованный текст.
3 Руководство пользователя
3.1 Требования к аппаратным средствам
Для эффективной работы программы необходимо следующее аппаратное обеспечение:
• CPU не ниже Intel Atom (1Ггц)
• 32 Mb оперативной памяти (рекомендуется 64 Mb)
• минимум 10mb свободного пространства на жестком диске
• 1 Mb видеопамяти
• операционная система Windows XP/Vista/7/8.1/10
• Мышь, клавиатура
3.2 Особенности запуска и работы с программой
Для работы программы не обходимо запустить исполняемый файл с расширением .exe.
3.3 Тестовые варианты программы
На этом рисунке мы видим как программа зашифровала текст «я пришел на пару».
Для этого мы ввели переменную условия шифрования/дешифрования(a), указавши 1 и ввели наше сообщение. Затем вводим переменную условие работы программы, тоже указываем 1 и попробуем расшифровать полученное сообщение.
На этом рисунке мы расшифровали наше сообщение. Для этого мы ввели переменную a, указав ей 0, т.к. мы хотим уже не зашифровать, а расшифровать сообщение и ввели сообщение. Затем мы указали 0 переменной work, т.к. хотим закончить работы и выйти из программы.
Выводы
С помощью средств языка программирования С++ мной был создан программный продукт, выполняющий шифрования или расшифровки текста с помощью двойного квадрата Уитстона. Данная программа позволяет пользователю быстро зашифровать или расшифровать сообщение нажатием одной клавиши.
При разработке программного продукта я приобрел опыт разработки программного обеспечения, что делает возможным писать производительный код программ с минимальным усилием со стороны программиста.
Список литературы
1. А.В.Яковлев, А.А.Безбогов, В.В.Родин, В.Н.Шамкин. Криптографическая защита информации. – Тамбов:Из-во Тамб. Гос. Тех.. ун-та, 2006. – 140 с.
2. Ю.В.Романец, П.А.Тимофеев, В.Ф.Шаньгин. Защита информации в компьютерных системах и сетях./ под ред. В.Ф.Шаньгина – М.: Радио и свіязь, 2001. – 376с.
3. Остапов С.Е., Валь Л.О. Основи криптографії: Навчальний посібник. – Чернівці: Книга – ХХІ, 2008. – 188 с.
4. Б.Шнайер. Прикладная криптография. Протоколы, алгоритмы, исходные коды на языке С. 1996.
5. М.Масленников. Практическая криптография. БХВ-Петербург,2003. – 464с.
Приложение А
Листинг программы:
#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;
void main()
{
srand(time(NULL));
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char a, work = '1', alphabet[] = {'а','б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', ',', ' ', '.', '\0'}; // массив русского алфавита
const int n = 6; // размерность квадратов
int x = 0, y = 0, i1 = 0, j1 = 0, i_text = 0; // индексы
char **square1 = new char*[n], **square2 = new char*[n]; // создание квадратов Уитстона и их строк
char* text = new char; // текст для шифрования или дешифрования
for (int i = 0; i < n; i++) // создание столбцов квадратов
{
square1[i] = new char[n];
square2[i] = new char[n];
for (int j = 0; j < n; j++)
{
square1[i][j] = ' ';
square2[i][j] = ' ';
}
}
for (int i = 0; i < strlen(alphabet); i++) // заполнение первого квадрата алфавитом
{
n:
x = rand()%n;
y = rand()%n;
if (square1[x][y] == ' ')
square1[x][y] = alphabet[i];
else goto n;
}
for (int i = 0; i < strlen(alphabet); i++) // заполнение второго квадрата алфавитом
{
m:
x = rand()%n;
y = rand()%n;
if (square2[x][y] == ' ')
square2[x][y] = alphabet[i];
else goto m;
}
cout << "Первый квадрта Уитстона" << endl;
for (int i = 0; i < n; i++)// вывод первого квадрата
{
for (int j = 0; j < n; j++)
cout << square1[i][j] << " ";
cout << endl;
}
cout << "Второй квадрта Уитстона" << endl;
for (int i = 0; i < n; i++)// вывод второго квадрата
{
for (int j = 0; j < n; j++)
cout << square2[i][j] << " ";
cout << endl;
}
while (work == '1')
{
cout << "Введите 1 для шифрования или 0 для дешифрования" << endl;
while (!(cin >> a) || (a != '1' && a != '0')) cout << "Неправильный ввод, повторите еще раз" << endl;
if (a == '1')
{
cout << "Введите сообщение для шифрования" << endl;
cin.get();
cin.getline(text, 100);
for (int i = 0; i < strlen(text); i++) // начало шифрования
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
if (i % 2 == 0) // разбивка сообщения на биграммы
{
if (text[i] == square1[j][k])
{
i1 = j;
j1 = k;
i_text = i;
}
}else if (text[i] == square2[j][k])
if (i1 != j) // замена биграммы при условии разных строк
{
text[i_text] = square2[i1][k];
text[i] = square1[j][j1];
j = n; k = n;
}
else // замена биграммы при условии одной строки
{
text[i_text] = square2[j][j1];
text[i] = square1[j][k];
j = n; k = n;
}
cout << text << endl; // вывод зашифрованного сообщения
}
else if (a == '0')
{
cout << "Введите сообщение для дешифрования" << endl;
cin.get();
cin.getline(text, 100);
for (int i = 0; i < strlen(text); i++) // начало дешифрования
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
if (i % 2 == 0) // разбивка сообщения на биграммы
{
if (text[i] == square2[j][k])
{
i1 = j;
j1 = k;
i_text = i;
}
}else if (text[i] == square1[j][k])
if (i1 != j) // замена биграммы при условии разных строк
{
text[i_text] = square1[i1][k];
text[i] = square2[j][j1];
j = n; k = n;
}
else // замена биграммы при условии одной строки
{
text[i_text] = square1[j][j1];
text[i] = square2[j][k];
j = n; k = n;
}
cout << text << endl; // вывод расшифрованного сообщения
}
cout << "Продожить работу?(1 - да, 0 - нет)" << endl;
while (!(cin >> work) || (work != '1' && work != '0')) cout << "Неправильный ввод, повторите еще раз" << endl;
}
system("pause");
}