Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР#1_Классические криптографические системы.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
163.84 Кб
Скачать

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