Реалізація алгоритмів кодування тексту: шифри Атбаш та Плейфера, страница 8

//* Функція відкриття файлу на копю'тері                                        *//

void OpenText()

{

if (Form1->OpenDialog1->Execute())

{

MessageBox(NULL, "Не можливо відкрити файл!", "Виникла помилка!", MB_OK);

Form1->Memo1->Clear();

Form1->Memo2->Clear();

Form1->Memo3->Clear();

Form1->Label2->Caption = Form1->Memo1->Text.Length();

Form1->Label3->Caption = Form1->Memo2->Text.Length();

Form1->Button2->Enabled = false;

Form1->Button3->Enabled = false;

}

else

{

// Обнуляємо всі умови

Form1->ProgressBar1->Position = 0;

Form1->Memo1->Clear();

Form1->Memo2->Clear();

Form1->Memo3->Clear();

MyText = "";

Key = "";

R = "";

ResText = "";

Pust = "";

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

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

Resh[i][j] = NULL;

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

Form1->Label2->Caption = Form1->Memo1->Text.Length();

Form1->Label3->Caption = Form1->Memo2->Text.Length();

Form1->Button2->Enabled = true;

Form1->Button3->Enabled = false;

}

}

//* Функція перевірки повтору літер                       *//

bool CheckKey()

{

for (int i=1; i<=Key.Length(); i++)

for (int j=1; j <= Key.Length(); j++)

if ((Key[i] == Key[j]) && (i != j))

return false;

return true;

}

//* Функція створення і виводу решітки на форму                               *//

void CreateR()

{

Form1->Memo3->Clear();

R = Key;

AnsiString Alphabet = Al;

for (int i=1; i<=Key.Length(); i++)

for (int j=1; j<=Alphabet.Length(); j++)

if (Key[i] == Alphabet[j])

Alphabet = Alphabet.Delete(j,1);

R += Alphabet;   // Створили рядкок з решітки

int num = 1;

AnsiString Str = "";

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

{

Str = "";

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

{

Str += R[num];

if (j != 16)

Str += " ";

num++;

}

Form1->Memo3->Lines->Add(Str);

}

// Заповняємо масив літер решітки

num = 1;

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

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

{

Resh[i][j] = R[num];

num++;

}

}

//* Функція вибору символу-порожняка                                         *//

void ChoosePust()

{

int k = 0;

int m = 1000;

for (int i=1; i<=R.Length(); i++)

{

for (int j=1; j<=MyText.Length(); j++)

if (R[i] == MyText[j])

k++;

if (k<m)

{

m = k;

k = 0;

Pust = R[i];

}

}

}

//* Функція вставлення порожняків і перевірки тексту на скінченність        *//

void EditText()

{

ChoosePust();    // обираємо прожняк

// Вставляємо прожняки в повторювані комірки Біграма

for (int i=1; i<MyText.Length(); i++)

if (MyText[i] == MyText[i+1])

MyText = MyText.Insert(Pust,i+1);

//* Перевіряємо текст на парність і якщо він не парний тоді вставляємо в кінець довільний символ                                                                                *//

int Len = MyText.Length();

if (Len % 2 != 0)

MyText += Pust;

}

//* Функція шифрування тексту                                                *//

void Encrypt()

{

ResText = "";

Form1->ProgressBar1->Position = 0;

Form1->ProgressBar1->Min = 0;

Form1->ProgressBar1->Max = MyText.Length();

// індекси літер в стовпцях

int ind_x1 = 0;

int ind_y1 = 0;

int ind_x2 = 0;

int ind_y2 = 0;

int k = 1;

while (k<MyText.Length())

{

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

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

{

if (MyText[k] == Resh[i][j])

{

ind_x1 = i;

ind_y1 = j;

}

if (MyText[k+1] == Resh[i][j])

{

ind_x2 = i;

ind_y2 = j;

}

}

// Якщо літери знаходяться в одному рядку

if (ind_x1 == ind_x2)

{

if (ind_y1 == 15)

{

ResText += Resh[ind_x1][0];

ResText += Resh[ind_x2][ind_y2+1];

}

else

if (ind_y2 == 15)

{

ResText += Resh[ind_x1][ind_y1+1];

ResText += Resh[ind_x2][0];

}

else

{

ResText += Resh[ind_x1][ind_y1+1];

ResText += Resh[ind_x2][ind_y2+1];

}

}

// Якщо літери знаходяться в одному стовпці

if (ind_y1 == ind_y2)

{

if (ind_x1 == 9)

{

ResText += Resh[0][ind_y1];