- •Лабораторная работа №4 классические криптографические системы
- •Теоретические сведения
- •Классические криптографические системы
- •Шифр Цезаря
- •1.2. Шифр Цезаря с ключевым словом
- •1.3. Аффинная криптосистема
- •1.4. Квадрат Полибия
- •1.5. Решетка Кардано
- •1.6. Таблица Виженера
- •1.7. Одноразовый шифровальный блокнот
- •2. Описание программы шифрования информации с использованием классических криптосистем
- •Порядок выполнения работы
- •Приложение 1
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