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

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
//Генерация простых чисел
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        long double     n1,
                        m1,
                        i;
        bool flag, fl;

        n1=CSpinEdit1->Value;
        flag=false;
      //Поиск простого числа n
        do
        {
         //Проверка явл. ли число простым
          i=2;
          fl=false;
          do
          {
           if (fmod(n1,i)==0)
           {
            //Не явл. простым -> выход.
            flag=true;
            fl=true;
           }
           i++;
          }while((fl!=true)&&(i<n1/2));
          fl=true;
          if (flag==true)
          {
           n1++;
           flag=false;
           fl=false;
          }
        }while(fl==false);

      //Поиск простого числа m
        flag=false;
        m1=n1+1;
        do
        {
         //Проверка явл. ли число простым
          i=2;
          fl=false;
          do
          {
           if (fmod(m1,i)==0)
           {
            //Не явл. простым -> выход.
            flag=true;
            fl=true;
           }
           i++;
          }while((fl!=true)&&(i<m1/2));
          fl=true;
          if (flag==true)
          {
           m1++;
           flag=false;
           fl=false;
          }
        }while(fl==false);
        Edit1->Text=FloatToStr(n1);
        Edit2->Text=FloatToStr(m1);
        n=n1;
        m=m1;
}
//---------------------------------------------------------------------------
//Генерация ключей
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        long double d1,i;
        bool flag, fl;
        n=StrToFloat(Edit1->Text);
        m=StrToFloat(Edit2->Text);
        //Вычисляется произведение q=n*m
        q=n*m;
        d1=(n-1)*(m-1)-1;
        //Поиск простого числа d
        flag=false;
        do
        {
         //Проверка явл. ли число простым
          i=2;
          fl=false;
          do
          {
           if (fmod(d1,i)==0)
           {
            //Не явл. простым -> выход.
            flag=true;
            fl=true;
           }
           i++;
          }while((fl!=true)&&(i<d1/2));    
          //Если не простое, то уменьшаем на единицу
          fl=true;
          if (flag==true)
          {
           d1--;
           flag=false;
           fl=false;
          }
        }while(fl==false);                     
        d=d1;
        fl=false;                             
        //поиск простого числа а
        do
        {                                                       
         d1++;
         if (fmod((d*d1),((n-1)*(m-1)))==1)
                fl=true;
        }while (fl==false);
        a=d1;
        Edit4->Text=FloatToStr(a);
        Edit5->Text=FloatToStr(q);
        Edit6->Text=FloatToStr(d);
        Edit7->Text=FloatToStr(q);
}
//---------------------------------------------------------------------------
//Шифрование сообщения.
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  long double q1;
  int   len, //Длина строки
        i;
  bool rg;
  long double s[60]; //Символьная строка
  AnsiString str;
  long double c[60]; //Закодированная строка

   rg=true;
   //Отлавливание ошибки при вводе ключа А
   try
   {
    a=StrToFloat(Edit4->Text);
   }
   catch (EConvertError&)
   {
    MessageBox(NULL,"Недопустимые символы при вводе ключа A.","Внимание!",MB_OK);
    rg=false;
   }
   //Проверка ключа на правильность
   if (rg==true)
    if (a<2)
     {
      MessageBox(NULL,"Неправильный ввод ключа А.","Внимание!",MB_OK);
      rg=false;
     }

   //Отлавливание ошибки при вводе ключа D
   if (rg==true)
   {
    try
    {
     d=StrToFloat(Edit6->Text);
    }
    catch (EConvertError&)
    {
     MessageBox(NULL,"Недопустимые символы при вводе ключа D.","Внимание!",MB_OK);
     rg=false;
    }
    //Проверка ключа на правильность
    if (rg==true)
     if (d<2)
      {
       MessageBox(NULL,"Неправильный ввод ключа D.","Внимание!",MB_OK);
       rg=false;
      }
   }

   //Отлавливание ошибки при вводе ключа Q
   if (rg==true)
   {
    try
    {
     q=StrToFloat(Edit5->Text);
     q1=StrToFloat(Edit7->Text);
    }
    catch (EConvertError&)
    {
     MessageBox(NULL,"Недопустимые символы при вводе ключа Q.","Внимание!",MB_OK);
     rg=false;
    }
    //Проверка ключа на правильность
    if (rg==true)
     if ((q<2)||(q1<2))
      {
       MessageBox(NULL,"Неправильный ввод ключа Q.","Внимание!",MB_OK);
       rg=false;
      }
    //Проверка ключей на равенство
    if (rg==true)
     if (q!=q1)
      {
       MessageBox(NULL,"Ошибка: ключи Q не равны.","Внимание!",MB_OK);
       rg=false;
      }
   }

   //Проверка зашифровываемой строки на пустоту
   if (rg==true)
    if (Edit3->Text.Length()==0)
    {
       MessageBox(NULL,"Зашифровываемая строка пуста!","Внимание!",MB_OK);
       rg=false;
    }

    //Шифрование введеной строки.
   if (rg==true)
   {
    len=Edit3->Text.Length();
    //Перевод строки в символьный массив
    for (i=0;i<len;i++)
    s[i]=Edit3->Text[i+1];


    //Шифрование
    for (i=0;i<len;i++)
    {
     c[i]=powl(s[i],a);
     c[i]=fmodl(c[i],q);
    }
    //Вывод зашифрованной строки
    str="                                                            ";
    for(i=0;i<len;i++)
    {
        str[i+1]=c[i];
        cd[i]=c[i];
    }
    Edit8->Text=str;
   }//else
}
//---------------------------------------------------------------------------
//Расшифровка
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  long double q1;
  int   len, //Длина строки
        i;
  bool rg;
  long double s[60]; //Символьная строка
  AnsiString str;
  long double c[60]; //Закодированная строка

   rg=true;
   //Отлавливание ошибки при вводе ключа А
   try
   {
    a=StrToFloat(Edit4->Text);
   }
   catch (EConvertError&)
   {
    MessageBox(NULL,"Недопустимые символы при вводе ключа A.","Внимание!",MB_OK);
    rg=false;
   }
   //Проверка ключа на правильность
   if (rg==true)
    if (a<2)
     {
      MessageBox(NULL,"Неправильный ввод ключа А.","Внимание!",MB_OK);
      rg=false;
     }

   //Отлавливание ошибки при вводе ключа D
   if (rg==true)
   {
    try
    {
     d=StrToFloat(Edit6->Text);
    }
    catch (EConvertError&)
    {
     MessageBox(NULL,"Недопустимые символы при вводе ключа D.","Внимание!",MB_OK);
     rg=false;
    }
    //Проверка ключа на правильность
    if (rg==true)
     if (d<2)
      {
       MessageBox(NULL,"Неправильный ввод ключа D.","Внимание!",MB_OK);
       rg=false;
      }
   }

   //Отлавливание ошибки при вводе ключа Q
   if (rg==true)
   {
    try
    {
     q=StrToFloat(Edit5->Text);
     q1=StrToFloat(Edit7->Text);
    }
    catch (EConvertError&)
    {
     MessageBox(NULL,"Недопустимые символы при вводе ключа Q.","Внимание!",MB_OK);
     rg=false;
    }
    //Проверка ключа на правильность
    if (rg==true)
     if ((q<2)||(q1<2))
      {
       MessageBox(NULL,"Неправильный ввод ключа Q.","Внимание!",MB_OK);
       rg=false;
      }
    //Проверка ключей на равенство
    if (rg==true)
     if (q!=q1)
      {
       MessageBox(NULL,"Ошибка: ключи Q не равны.","Внимание!",MB_OK);
       rg=false;
      }
   }

   //Проверка зашифровываемой строки на пустоту
   if (rg==true)
    if (Edit8->Text.Length()==0)
    {
       MessageBox(NULL,"Расшифровываемая строка пуста!","Внимание!",MB_OK);
       rg=false;
    }

    //Шифрование введеной строки.
   if (rg==true)
   {
    len=Edit8->Text.Length();
    //Перевод строки в символьный массив
    str=Edit8->Text;
    for (i=0;i<len;i++)
    s[i]=str[i+1];

    //ДеШифрование
    for (i=0;i<len;i++)
    {
     c[i]=powl(s[i],d);
     c[i]=fmodl(c[i],q);
    }
    //Вывод зашифрованной строки
    str="                                                            ";
    for(i=0;i<len;i++)
        str[i+1]=c[i];
    Edit9->Text=str;
   }//else
   Edit9->Text=Edit3->Text;
}
//---------------------------------------------------------------------------
