Метод Хилла

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

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 19.04.2011
Размер файла 911,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

НАЦИОНАЛЬНЫЙ АВИАЦИОННЫЙ УНИВЕРСИТЕТ

Контрольная РАБОТА

по дисциплине: Прикладная криптология

Тема: Метод Хилла

2010

Введение

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

Задание и вариант:

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

Вариант задания - метод Хилла.

Теоретические сведения

Шифр Хилла - полиграммный шифр подстановки, основанный на линейной алгебре. В шифре Хилла ключ - квадратная матрица размера , в котором m. является размером блока. Если мы вызываем ключевую матрицу K, то каждый элемент ki, j определяется матрицей, как показано на рис. 1.

Рис. 1 - Ключ в шифре Хилла

Покажем, как получается один блок зашифрованного текста. Если мы обозначим m символов блоков исходного текста P1, P2 ..., Pm, соответствующие символы в блоках зашифрованного текста будут C1, C2 , ..., Cm. Тогда мы имеем

C1 = P1k11+P2k21+……+Pmkm1

C2 = P1k12+P2k22+……+Pmkm2

………………………………………………………

Cm = P1k1m+ P2k2m +……+ Pmkmm

Уравнения показывают, что каждый символ зашифрованного текста, такой, как C1, зависит от символов всего исходного текста в блоке (P1, P2,..., Pm).

Шифрование

Каждой букве сперва сопоставляется число. Для латинского алфавита часто используется простейшая схема: A = 0, B =1, ..., Z=25, но это не является существенным свойством шифра. Блок из n букв рассматривается как n-мерный вектор и умножается на n ? n матрицу по модулю 26. (Если в качестве основания модуля используется число большее 26, то можно использовать другую числовую схему для сопоставления буквам чисел и добавить пробелы и знаки пунктуации.) Матрица целиком является ключом шифра. Матрица должна быть обратима, чтобы была возможна операция расшифрования. В следующих примерах используются латинские буквы от A до Z, соответствующие им численные значения приведены в таблице.

Рассмотрим сообщение 'DOG' и представленный ниже ключ (GYBNQKURP в буквенном виде):

Так как букве 'D' соответствует число 3, 'O' - 14, 'G' - 6, то сообщение - это вектор

Тогда зашифрованный вектор будет

что соответствует шифротексту 'WLY'. Теперь предположим, что наше сообщение было 'GOD' или

Теперь зашифрованный вектор будет

что соответствует шифротексту 'LUN'. Видно, что каждая буква шифротекста сменилась. Шифр Хилла достиг диффузии по Шеннону, и n-размерный шифр Хилла может достигать диффузии n символов за раз.

Расшифрование

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

Возьмем шифротекст из предыдущего примера 'WLY'. Тогда мы получим

что возвращает нас к сообщению 'DOG', как мы и рассчитывали.

Необходимо обсудить некоторые сложности, связанные с выбором шифрующей матрицы. Не все матрицы имеют обратную. Матрица будет иметь обратную в том и только в том случае, когда ее детерминант не равен нулю и не имеет общих делителей с основанием модуля. Таким образом, если мы работаем с основанием модуля 26 как в примерах выше, то детерминант должен быть ненулевым и не делиться на 2 и 13. Если детерминант матрицы равен нулю или имеет общие делители с основанием модуля, то такая матрица не может использоваться в шифре Хилла, и должна быть выбрана другая матрица (в противном случае шифротекст будет невозможно расшифровать). Тем не менее, матрицы, которые удовлетворяют вышеприведенным условиям, существуют в изобилии.

Детерминант матрицы из примера:

Итак, детерминант равен 25 по модулю 26. Так число 25 не имеет общих делителей с числом 26, то матрица с таким детерминантом может использоваться в шифре Хилле.

Опасность того, что детерминант матрицы ключа будет иметь общие делители с основанием модуля может быть устранена путем выбирания простого числа в качестве основания модуля. Например, в более удобном варианте шифра Хилла в алфавит добавляют 3 дополнительных символа (таких как пробел, точка и знак вопроса), чтобы увеличить основание модуля до 29.

Криптостойкость

К сожалению, стандартный шифр Хилла уязвим к атаке по выбранному открытому тексту, потому что он полностью линейный. Криптоаналитик, который перехватит n2 пар символ сообщения/символ шифротекста сможет составить систему линейных уравнений, которую обычно не сложно решить. Если окажется, что система не решаема, то необходимо всего лишь добавить еще несколько пар символ сообщения/символ шифротекста. Такого рода расчеты средствами обычных алгоритмов линейной алгебры требует совсем немного времени.

Криптоанализ шифров Хилла

Криптоанализ только для зашифрованного шифрами Хилла текста труден. Во-первых, атака грубой силы при шифре Хилла чрезвычайно сложна, потому что матрица-ключ - . Каждый вход может иметь одно из 26 значений. Во-первых, это означает размер ключа . Однако, не все матрицы имеют мультипликативную инверсию. Поэтому область существования ключей все же не такая огромная.

Во-вторых, шифры Хилла не сохраняют статистику обычного текста. Невозможно провести анализ частоты отдельных букв из двух или трех букв. Анализ частоты слов размера m мог бы cработать, но очень редко исходный текст имеет много одинаковых строк размера m. Можно провести атаку на шифр, используя метод знания исходного текста, если знать значение m и пары "исходный текст/зашифрованный текст", по крайней мере m блоков. Блоки могут принадлежать тому же самому сообщению или различным сообщениям, но должны быть различны. Поэтому можно создать две матрицы, P (обычный текст) и C (зашифрованный текст), в котором соответствующие строки представляют известные пары обычного/зашифрованного текста. Поскольку C = PK, можно использовать отношения K = CP-1, чтобы найти ключ, если P является обратимым. Если P не является обратимым, то должно быть задействовано различные наборы m пар обычного/зашифрованного текста.

Если не известно значение m, можно попробовать различные значения при условии, что m не является очень большим.

Длина ключа

Длина ключа - это двоичный логарифм от количества всех возможных ключей. Существует матриц размера n ? n. Значит, или приблизительно 4.7n2 - верхняя грань длины ключа для шифра Хилла, использующего матрицы n ? n. Это только верхняя грань, поскольку не каждая матрица обратима, а только такие матрицы могут быть ключом. Количество обратимых матриц может быть рассчитано при помощи Китайской теоремы об остатках. Т. е. матрица обратима по модулю 26 тогда и только тогда, когда она обратима и по модулю 2 и по модулю 13. Количество обратимых по модулю 2 матриц размера n ? n равно порядку линейной группы GL(n,Z2). Это

Аналогично, количество обратимых по модулю 13 матриц (т. е. порядок GL(n,Z13)) равно

Количество обратимых по модулю 26 матриц равно произведению этих двух чисел. Значит,

Кроме того, будет разумно избегать слишком большого количества нулей в матрице-ключе, так как они уменьшают диффузию. В итоге получается, что эффективное пространство ключей стандартного шифра Хилла составляет около 4.64n2 ? 1.7. Для шифра Хилла 5 ? 5 это составит приблизительно 114 бит. Очевидно, полный перебор - не самая эффективная атака на шифр Хилла.

Алгоритм работы программы

При запуске программы открывается окно, которое имеет вид:

Работа с интерфейсом программы происходит по следующему алгоритму:

ввод данных для зашифровки;

нахождение ключа;

расшифрование и получение исходного текста.

При запуске программы в поле текста нужно ввести сообщение, которое нужно зашифровать. Текст можно загрузить из файла нажатием кнопки «Загрузить». Поле «Ключ» содержит ключ по умолчанию - криптолог.

Следующим блоком работы программы есть демонстрация зашифровки. Зашифровка выполняется нажатием кнопки «Расшифровать». Каждому символу исходного текста сопоставляется его порядочный номер по алфавиту. Текст (уже представлен цифрами) разбивается на блоки по три символа (поскольку квадратная матрица ключа имеет размерность 3*3) и записывается последовательно по рядкам в матрицу. То есть каждая строчка будет представлять блок текста. Каждый из таких блоков умножается на квадратную матрицу ключа, и мы получаем новую матрицу. Чтобы заменить цифры символами обратно и получить шифротекст необходимо каждый элемент матрицы разделить по модулю размерности используемого алфавита. После этого получим новую матрицу с номерами символов от 0 до 54 (алфавит содержит 55 символов). Каждая ячейка матрицы переводится в символ согласно порядковому номеру ее значения в алфавите. Полученный зашифрованный текст отображается в новом поле.

Потом необходимо найти ключ. Для этого нужно кликнуть по кнопке «Найти ключ». Чтобы найти ключ необходимо найти обратную матрицу от матрицы открытого текста и умножить ее на матрицу шифротекста. Мы припускаем, что удается перехватить несколько блоков открытого текста, находим детерминант такой матрицы и строим транспонированную матрицу из алгебраических дополнений каждого элемента. Если эту матрицу (транспонированную) разделить на детерминант матрицы из блоков открытого текста и умножить на матрицу той же размерности шифротекста, мы получим квадратную матрицу ключа. После описанных действий на панель выводится ключ согласно цифрам в полученной матрице.

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

Код программы

Следуя описанному выше алгоритму представлен код программы:

//----------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//----------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//----------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//----------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Memo2->Clear();

//------формирование_алфавита-------------------------------------------

char A[55]; int i,j,x,y,z,q=0,n=0,c=0,l=0;

A[0]='а';A[1]='б';A[2]='в';A[3]='г';A[4]='д';A[5]='е';

A[6]='ё';A[7]='ж';A[8]='з';A[9]='и';A[10]='й';A[11]='к';

A[12]='л';A[13]='м';A[14]='н';A[15]='о';A[16]='п';

A[17]='р';A[18]='с';A[19]='т';A[20]='у';A[21]='ф';

A[22]='х';A[23]='ц';A[24]='ч';A[25]='ш';A[26]='щ';

A[27]='ъ';A[28]='ы';A[29]='э';A[30]='ю';A[31]='я';

A[32]='ь';A[33]='_';A[34]='.';A[35]=',';A[36]='-';

A[37]=' ';A[38]='"';A[39]='(';A[40]=')';A[41]=';';

A[42]=':';A[43]='?';A[44]='!';A[45]='1';A[46]='2';

A[47]='3';A[48]='4';A[49]='5';A[50]='6';A[51]='7';

A[52]='8';A[53]='9';A[54]='0';

char B[55];

B[0]='А'; B[1]='Б'; B[2]='В';B[3]='Г';B[4]='Д';B[5]='Е';

B[6]='Ё';B[7]='Ж';B[8]='З';B[9]='И';B[10]='Й';B[11]='К';

B[12]='Л';B[13]='М';B[14]='Н';B[15]='О';B[16]='П';B[17]='Р';

B[18]='С';B[19]='Т';B[20]='У';B[21]='Ф';B[22]='Х';B[23]='Ц';

B[24]='Ч';B[25]='Ш';B[26]='Щ';B[27]='Ъ';B[28]='Ы';B[29]='Э';

B[30]='Ю';B[31]='Я';B[32]='Ь';B[33]='_';B[34]='.';B[35]=',';

B[36]='-';B[37]=' ';B[38]='"';B[39]='(';B[40]=')';B[41]=';';

B[42]=':';B[43]='?';B[44]='!';B[45]='1';B[46]='2';B[47]='3';

B[48]='4';B[49]='5';B[50]='6';B[51]='7';B[52]='8';B[53]='9';

B[54]='0';

for(int i=0;i<StringGrid1->ColCount;i++)

StringGrid1->Cells[i][0]=A[i];

for(int i=0;i<StringGrid1->ColCount;i++)

StringGrid1->Cells[i][1]=B[i];

for(int i=0;i<StringGrid1->ColCount;i++)

StringGrid1->Cells[i][2]=i;

x=Memo1->Lines->Text.Length();

y=Edit2->Text.Length();

//------заполнение_StringGrid3_номерами_символов_ключа----------------

AnsiString S=Edit2->Text;

char *K;

K=new char[y];

for (i=0;i<y;i++)

K[i]=S[i+1];

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

for(int j=0;j<3;j++)

for(int k=0;k<55;k++)

if(K[j+i*3]==*StringGrid1->Cells[k][0].c_str())

StringGrid3->Cells[j][i]=k;

//------заполнение_StringGrid2_номерами_символов_текста-----------------

AnsiString R=Memo1->Text;

char *T;

T=new char[x];

for (i=0;i<x;i++)

T[i]=R[i+1];

c=x%3;

n=(x-x%3)/3;

if(c>=1)

z=n+1;

else z=n;

c=(z*3)-x;

StringGrid2->RowCount=z;

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

for(int j=0;j<3;j++)

for(int k=0;k<55;k++)

if((i+1)==z)

{

if((c==1 && c>=j) || c==0 || (c==2 && c>=j+2))

{

if(T[j+i*3]==*StringGrid1->Cells[k][0].c_str() || T[j+i*3]==*StringGrid1->Cells[k][1].c_str())

{

StringGrid2->Cells[j][i]=k;

}

}

else

{

StringGrid2->Cells[j][i]=37;

}

}

else

if(T[j+i*3]==*StringGrid1->Cells[k][0].c_str() || T[j+i*3]==*StringGrid1->Cells[k][1].c_str())

{

StringGrid2->Cells[j][i]=k;

}

//------перемножение_StringGrid2_и_StringGrid3--------------------------

l=3*z;

int *P;

P=new int[l];

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

P[i]=0;

q=0;

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

for(int k=0;k<3;k++)

{

for(int j=0;j<3;j++)

P[q]=P[q]+StrToInt(StringGrid2->Cells[j][i])*StrToInt(StringGrid3->Cells[k][j]);

q++;

}

//------вывод_результатов_в_StringGrid4---------------------------------

q=0;

StringGrid4->RowCount=z;

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

for(int j=0;j<3;j++)

{

StringGrid4->Cells[j][i]=P[q];

q++;

}

//------заполнение_StringGrid5_значениями_StringGrid4_по_модулю-----

q=0;

StringGrid5->RowCount=z;

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

for(int j=0;j<3;j++)

{

StringGrid5->Cells[j][i]=P[q]%55;

q++;

}

//---вывод_текста_в_соответствии_номерам_символов_из_StringGrid5--

char *O;

O=new char[l];

q=0;

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

for(int j=0;j<3;j++)

for(int k=0;k<55;k++)

if(StrToInt(StringGrid5->Cells[j][i])==StrToInt(StringGrid1->Cells[k][2]))

{

O[q]=*StringGrid1->Cells[k][0].c_str();

q++;

}

for(i=0;i<l;i++)

Memo2->Lines->Text=Memo2->Lines->Text+O[i];

delete(P);

delete(T);

delete(K);

delete(O);

}

//----------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{

Close();

}

//----------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

//----Нахождение_детерминанта_от_блоков_открытого_текста-----------

int Det=0,q=0,i,j;

Det=StringGrid2->Cells[0][0]*(StringGrid2->Cells[1][1]*StringGrid2->Cells[2][2]-StringGrid2->Cells[2][1]*StringGrid2->Cells[1][2])-

StringGrid2->Cells[1][0]*(StringGrid2->Cells[0][1]*StringGrid2->Cells[2][2]-StringGrid2->Cells[2][1]*StringGrid2->Cells[0][2])+

StringGrid2->Cells[2][0]*(StringGrid2->Cells[0][1]*StringGrid2->Cells[1][2]-StringGrid2->Cells[1][1]*StringGrid2->Cells[0][2]);

int I[9];

I[0]=StringGrid2->Cells[1][1]*StringGrid2->Cells[2][2]-StringGrid2->Cells[2][1]*StringGrid2->Cells[1][2];

I[1]=-(StringGrid2->Cells[1][0]*StringGrid2->Cells[2][2]-StringGrid2->Cells[2][0]*StringGrid2->Cells[1][2]);

I[2]=StringGrid2->Cells[1][0]*StringGrid2->Cells[2][1]-StringGrid2->Cells[2][0]*StringGrid2->Cells[1][1];

I[3]=-(StringGrid2->Cells[0][1]*StringGrid2->Cells[2][2]-StringGrid2->Cells[0][2]*StringGrid2->Cells[2][1]);

I[4]=StringGrid2->Cells[0][0]*StringGrid2->Cells[2][2]-StringGrid2->Cells[0][2]*StringGrid2->Cells[2][0];

I[5]=-(StringGrid2->Cells[0][0]*StringGrid2->Cells[2][1]-StringGrid2->Cells[2][0]*StringGrid2->Cells[0][1]);

I[6]=StringGrid2->Cells[0][1]*StringGrid2->Cells[1][2]-StringGrid2->Cells[0][2]*StringGrid2->Cells[1][1];

I[7]=-(StringGrid2->Cells[0][0]*StringGrid2->Cells[1][2]-StringGrid2->Cells[0][2]*StringGrid2->Cells[1][0]);

I[8]=StringGrid2->Cells[0][0]*StringGrid2->Cells[1][1]-StringGrid2->Cells[0][1]*StringGrid2->Cells[1][0];

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

for(int j=0;j<3;j++)

{

StringGrid6->Cells[j][i]=I[q];

q++;

}

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

for(int j=0;j<3;j++)

StringGrid7->Cells[j][i]=StringGrid4->Cells[j][i];

Label8->Caption=Det;

//------перемножение_StringGrid6_и_StringGrid7--------------------------

int E[9];

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

E[i]=0;

q=0;

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

for(int k=0;k<3;k++)

{

for(int j=0;j<3;j++)

E[q]=E[q]+StrToInt(StringGrid6->Cells[j][i])*StrToInt(StringGrid7->Cells[k][j]);

q++;

}

//------вывод_результатов_в_StringGrid8---------------------------------

q=0;

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

for(int j=0;j<3;j++)

{

StringGrid8->Cells[j][i]=E[q]/Det;

q++;

}

//---вывод_текста_в_соответствии_номерам_символов_из_StringGrid8--

char O[9];

q=0;

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

for(int j=0;j<3;j++)

for(int k=0;k<55;k++)

if(StrToInt(StringGrid8->Cells[j][i])==StrToInt(StringGrid1->Cells[k][2]))

{

O[q]=*StringGrid1->Cells[k][0].c_str();

q++;

}

Panel1->Caption="";

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

Panel1->Caption=Panel1->Caption+O[i];

}

//----------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Memo3->Clear();

int q=0,l=0,z,Det=0;

//------Заполнение_StringGrid9_шифротекстом-----------------------------

z=StringGrid4->RowCount;

StringGrid9->RowCount=z;

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

for(int j=0;j<3;j++)

StringGrid9->Cells[j][i]=StringGrid4->Cells[j][i];

//------Нахождение_детерминанта_ключа-----------------------------------

Det=StringGrid8->Cells[0][0]*(StringGrid8->Cells[1][1]*StringGrid8->Cells[2][2]-StringGrid8->Cells[2][1]*StringGrid8->Cells[1][2])-

StringGrid8->Cells[1][0]*(StringGrid8->Cells[0][1]*StringGrid8->Cells[2][2]-StringGrid8->Cells[2][1]*StringGrid8->Cells[0][2])+

StringGrid8->Cells[2][0]*(StringGrid8->Cells[0][1]*StringGrid8->Cells[1][2]-StringGrid8->Cells[1][1]*StringGrid8->Cells[0][2]);

int I[9];

I[0]=StringGrid8->Cells[1][1]*StringGrid8->Cells[2][2]-StringGrid8->Cells[2][1]*StringGrid8->Cells[1][2];

I[1]=-(StringGrid8->Cells[1][0]*StringGrid8->Cells[2][2]-StringGrid8->Cells[2][0]*StringGrid8->Cells[1][2]);

I[2]=StringGrid8->Cells[1][0]*StringGrid8->Cells[2][1]-StringGrid8->Cells[2][0]*StringGrid8->Cells[1][1];

I[3]=-(StringGrid8->Cells[0][1]*StringGrid8->Cells[2][2]-StringGrid8->Cells[0][2]*StringGrid8->Cells[2][1]);

I[4]=StringGrid8->Cells[0][0]*StringGrid8->Cells[2][2]-StringGrid8->Cells[0][2]*StringGrid8->Cells[2][0];

I[5]=-(StringGrid8->Cells[0][0]*StringGrid8->Cells[2][1]-StringGrid8->Cells[2][0]*StringGrid8->Cells[0][1]);

I[6]=StringGrid8->Cells[0][1]*StringGrid8->Cells[1][2]-StringGrid8->Cells[0][2]*StringGrid8->Cells[1][1];

I[7]=-(StringGrid8->Cells[0][0]*StringGrid8->Cells[1][2]-StringGrid8->Cells[0][2]*StringGrid8->Cells[1][0]);

I[8]=StringGrid8->Cells[0][0]*StringGrid8->Cells[1][1]-StringGrid8->Cells[0][1]*StringGrid8->Cells[1][0];

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

for(int j=0;j<3;j++)

{

StringGrid10->Cells[j][i]=I[q];

q++;

}

Label14->Caption=Det;

//------перемножение_StringGrid9_и_StringGrid10-------------------------

l=z*3;

int *E;

E=new int[l];

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

E[i]=0;

q=0;

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

for(int k=0;k<3;k++)

{

for(int j=0;j<3;j++)

E[q]=E[q]+StrToInt(StringGrid9->Cells[j][i])*StrToInt(StringGrid10->Cells[k][j]);

q++;

}

//------вывод_результатов_в_StringGrid11--------------------------------

StringGrid11->RowCount=z;

q=0;

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

for(int j=0;j<3;j++)

{

StringGrid11->Cells[j][i]=E[q]/Det;

q++;

}

//---вывод_текста_в_соответствии_номерам_символов_из_StringGrid11-

char *O;

O=new char[l];

q=0;

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

for(int j=0;j<3;j++)

for(int k=0;k<55;k++)

if(StrToInt(StringGrid11->Cells[j][i])==StrToInt(StringGrid1->Cells[k][2]))

{

O[q]=*StringGrid1->Cells[k][0].c_str();

q++;

}

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

Memo3->Lines->Text=Memo3->Lines->Text+O[i];

delete(O);

}

//----------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{

Memo1->Clear();

OpenDialog1->Execute();

if (Form1->OpenDialog1->FileName!="")

Memo1->Lines->LoadFromFile(Form1->OpenDialog1->FileName);

}

//----------------------------------------------------------------------

Полученные экспериментальные данные

Загрузка текста из файла:

Зашифрование текста:

Нахождение ключа:

хилл шифр ключ криптоанализ

Расшифрование:

Выводы

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

При реализации данного алгоритма, к сожалению, возникли некоторые сложности. А именно при нахождении ключа и расшифровке используется матрица шифротекста, в которой все числа находятся в диапазоне от 0 до 55, то есть каждому числу соответствует определенная буква или символ алфавита. Эта матрица получена делением по модулю размерности алфавита матрицы, полученной в результате перемножения матриц текста и ключа, для того чтобы перевести большие числа в нужный диапазон и получить шифр. Мы же использовали матрицу, содержащую большие числа без деления ее по модулю. Это связано с тем, что для каждого символа шифра порядок уменьшения его изначально большого значения разный. Это значит, что, например, для символа «а» (номер 0 в алфавите) его изначальное числовое значение могло быть - 0, 55, 110, 165, 220 и так далее. Поэтому было сложно применить нужный алгоритм из-за ошибок памяти приложения, достаточно длительного выполнения программы при небольшом тексте, большого количества подбора комбинаций чисел (которые представляют один символ) и выбора одной нужной.

Размещено на Allbest.ru


Подобные документы

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

    курсовая работа [45,0 K], добавлен 13.11.2009

  • Организация возможности просмотра текстовых файлов и осуществления поиска нужных слов в тексте. Редактирование текста (шрифт, размер). Алгоритм поиска подстроки в строке (метод Кнута-Морриса-Пратта). Загрузка текста из файла (с расширением .txt).

    курсовая работа [2,2 M], добавлен 29.05.2013

  • История появления и развития шифрования текста. Проблема шифрования и дешифрования текстовых сообщений в современности. Создание программы для зашифровки и расшифровки вводимого текста пятью методами: Атбаш, Цезаря, Полибия, Гронсфельда и Винжера.

    курсовая работа [923,6 K], добавлен 26.12.2011

  • Разработка алгоритмов на персональном компьютере, среда Турбо Паскаль. Работа программы для шифровки и дешифровки текста. Алгоритм шифрования: с помощью команды ORD. Функция Password а преобразовании символа, введенного пользователем ключа в его числовой

    курсовая работа [19,6 K], добавлен 17.10.2008

  • Работа в окне документа. Ввод текста. Вставка и удаление текста. Отмена результатов выполненных действий. Перемещение и копирование текста методом "перетащить-оставить". Форматирование текста. Сохранение документа. Шаг вперед: смена регистра.

    лабораторная работа [220,9 K], добавлен 10.03.2007

  • История возникновения криптографии. Открытый ключ криптосистемы. Шифрование секреторного ключа. Математические методы обеспечения конфиденциальности и аутентичности информации. Преобразование текста на основе секретного алгоритма в шифрованный текст.

    презентация [260,8 K], добавлен 11.10.2015

  • Структура заданного исходного файла и структуры данных, соответствующие данным файла. Подпрограмма проверки принадлежности текста к одной из шести кодовых таблиц. Алгоритмы перекодировки файла в cp1251. Алгоритм сортировки записей исходного файла.

    курсовая работа [63,7 K], добавлен 12.12.2010

  • Выбор шифров перестановки для проведения анализа. Анализ алгоритма двух различных шифров, построение блок-схемы алгоритма и программы, разработка общего интерфейса. Сравнение шифров перестановки по результатам шифрования и криптоанализа текстов.

    курсовая работа [2,8 M], добавлен 14.01.2014

  • Криптографические методы обеспечения конфиденциальности, невозможности прочтения информации посторонним. Современные методы шифрования информации как обратимого преобразования открытого текста в шифрованный на основе секретного алгоритма или ключа.

    презентация [514,3 K], добавлен 06.02.2016

  • Кодирование информации в двоичном коде. Разработка приложения, реализующего следующее преобразование текста: каждая буква исходного текста заменяется третьей после нее буквой в алфавите, который считается написанным по кругу. Алгоритм работы программы.

    курсовая работа [1,2 M], добавлен 20.12.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.