Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЗИ-ЛР№4.doc
Скачиваний:
3
Добавлен:
15.11.2019
Размер:
92.16 Кб
Скачать

1.7. Одноразовый шифровальный блокнот

Примером нераскрываемого шифра может служить так называемый “одноразовый шифровальный блокнот” - шифр, в основе которого лежит та же идея, что в шифре Цезаря. Назовем расширенным алфавитом совокупность букв алфавита, знаков препинания {. , : ; ! ? () – “ <пробел>}, число символов расширенного русского алфавита в данном варианте будет равно 44. Занумеруем символы расширенного алфавита числами от 0 до 43. Тогда любой передаваемый текст можно рассматривать как последовательность {an} чисел множества A={0,1,2,…,43}.

Предположим, что имеем случайную последовательность {cn} из чисел множества А той же длины, что и передаваемый текст - ключ. Складывая по модулю 44 число из передаваемого текста an с соответствующим числом из множества ключа cn:

an + cn  bn (mod 44), 0<=bn<=43

получим последовательность {bn} знаков шифрованного текста. Чтобы получить передаваемый текст, можно воспользоваться тем же ключом:

an  bn - cn (mod 44), 0<=an<=43

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

2. Описание программы шифрования информации с использованием классических криптосистем

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

Программа написана на языке Visual C++ с использованием библиотек CLR от Microsoft.

Программа имеет оконный интерфейс, в ней возможен ввод пользовательского текста, а также предусмотрена возможность открывать и сохранять внешние файлы. В программе доступен только латинский алфавит.

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

В программе реализованы следующие алгоритмы шифрования.

Алгоритм шифрования с помощью кода Цезаря

Словесное описание алгоритма: каждая буква в кодируемой фразе замещается на букву того же алфавита, но с заданным смещением. В данной программе смещение задается пользователем.

Код процедуры:

System::String^ cesar(System::String^ input){

System::String^ output;

System::String^ shft;

dialogCatchWord^ dCW = gcnew dialogCatchWord();

dCW->labelCatchWord->Text = “Enter shift”;

dCW->Text = “Shift”;

dCW->textBoxCatchWord->MaxLength = 2;

shft = dCW->ShowDlg();

System::Int32 shift;

shift = System::Int32::Parse(shft);

if ( shift > 25 ) {

output = “Error 103! Shift must be < 26!!!”;

return output;

}

for (int I = 0; I < input->Length; i++){

System::Char ch;

if ( input[i] >= ‘A’ && input[i] <= ‘Z’ ) {

ch = input[i] + shift;

if ( input[i] + shift > 90 ) ch -= 26;

}

else if ( input[i] >= ‘a’ && input[i] <= ‘z’ ) {

ch = input[i] + shift;

if ( input[i] + shift > 122 ) ch -=26;

}

else ch = input[i];

output = System::String::Concat( output, ch.ToString() );

}

return output;

}

Пример: veni vidi vici

yhql ylgl ylfl – закодировано со смещением 3

zirm zmhm zmgm – закодировано со смещением 4

Алгоритм шифрования с помощью решетки Кардано

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

Код процедуры:

System::String^ cardano(System::String^ input){

System::String^ output;

int* code;

code = new int[input->Length];

Random rnd;

for ( int i = 0; i < input->Length; i++ ) code[i] = rnd.Next(2);

for ( int i = 0; i < input->Length; i++ ) if ( code[i] && ( String::Compare(input[i].ToString(), " ") != 0 ) ) output = String::Concat(output, input[i].ToString());

else if ( String::Compare(input[i].ToString(), " ") == 0 ) output = String::Concat(output, " " );

return output;

}

Пример: mother washed a window-frame

010001 011011 0 011001011010

o r as ed in w fr m

Алгоритм шифрования с помощью «одноразового шифровального блокнота»

Словесное описание алгоритма: используется расширенный алфавит ABCDEFGHIJKLMNOPQRSTUVWXYZ!"(),-.?:; Каждый символ входного текста получает номер согласно позиции в расширенном алфавите. Далее с помощью генератора (псевдо)случайных чисел с интервалом от 0 до 36 создается последовательность той же длины, что и входной текст. Затем происходит посимвольное сложение по модулю 36 элементов входного текста и элементов последовательности. Получаемый выходной текст есть закодированный входной текст.

Код процедуры:

int getIntexLetter(System::Char letter, System::String^ aplphabeth){

int ret;

for ( int i = 0; i < aplphabeth->Length; i++ ) if ( letter == aplphabeth[i] ) ret = i;

return ret;

}

System::String^ notepad(System::String^ input){

System::String^ output;

System::String^ alphabeth;

System::Char ch;

input = input->ToUpper();

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

if ( i < 26 ) ch = i + 65;

if ( i == 26 ) ch = '!';

if ( i == 27 ) ch = '"';

if ( i == 28 ) ch = '(';

if ( i == 29 ) ch = ')';

if ( i == 30 ) ch = ',';

if ( i == 31 ) ch = '-';

if ( i == 32 ) ch = '.';

if ( i == 33 ) ch = '?';

if ( i == 34 ) ch = ':';

if ( i == 35 ) ch = ';';

if ( i == 36 ) ch = ' ';

alphabeth = System::String::Concat(alphabeth, ch.ToString());

}

int* code;

code = new int[input->Length];

Random rnd;

for ( int i = 0; i < input->Length; i++ ) code[i] = rnd.Next(37);

for ( int i = 0; i < input->Length; i++ ){

int index = getIntexLetter(input[i], alphabeth);

index += code[i];

if ( index > 36 ) index -= 36;

output = System::String::Concat(output, alphabeth[index].ToString());

}

return output;

}

Алгоритм шифрования с помощью таблицы Виженера

Словесное описание алгоритма: таблица Виженера представляет собой квадратную таблицу с числом строк и столбцов, равным количеству букв алфавита.

Выбирается какое-либо кодовое слово и записывается под входным текстом с определенным повторением.

Пример: mother washed a window-frame

father father f atherf ather

ROMOII BALOIU F WBUHFB-FKHQV

(кодовое слово father)

comput ercomp u tercom puter

OCFWYK ARUVQS U PMEFCI-ULTQV

(кодовое слово computer)

ABCDEFGHIJKLMNOPQRSTUVWXYZ

BCDEFGHIJKLMNOPQRSTUVWXYZA

CDEFGHIJKLMNOPQRSTUVWXYZAB

DEFGHIJKLMNOPQRSTUVWXYZABC

EFGHIJKLMNOPQRSTUVWXYZABCD

FGHIJKLMNOPQRSTUVWXYZABCDE

GHIJKLMNOPQRSTUVWXYZABCDEF

HIJKLMNOPQRSTUVWXYZABCDEFG

IJKLMNOPQRSTUVWXYZABCDEFGH

JKLMNOPQRSTUVWXYZABCDEFGHI

KLMNOPQRSTUVWXYZABCDEFGHIJ

LMNOPQRSTUVWXYZABCDEFGHIJK

MNOPQRSTUVWXYZABCDEFGHIJKL

NOPQRSTUVWXYZABCDEFGHIJKLM

OPQRSTUVWXYZABCDEFGHIJKLMN

PQRSTUVWXYZABCDEFGHIJKLMNO

QRSTUVWXYZABCDEFGHIJKLMNOP

RSTUVWXYZABCDEFGHIJKLMNOPQ

STUVWXYZABCDEFGHIJKLMNOPQR

TUVWXYZABCDEFGHIJKLMNOPQRS

UVWXYZABCDEFGHIJKLMNOPQRST

VWXYZABCDEFGHIJKLMNOPQRSTU

WXYZABCDEFGHIJKLMNOPQRSTUV

XYZABCDEFGHIJKLMNOPQRSTUVW

YZABCDEFGHIJKLMNOPQRSTUVWX

ZABCDEFGHIJKLMNOPQRSTUVWXY

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]