четверг, 12 июня 2014 г.

Несколько вариантов шифрования

№1 Примитивное шифрование встроенными средствами

№2 Немного модифицированный Магический квадрат
согласно правил
Сгенерить квадрат можно тут







Вариант № 1




#include <EncdDecd.hpp>


//---------------------------------------------------------------------------
UnicodeString TForm1::Crypt(UnicodeString in)
{
UnicodeString CryptStr;
CryptStr=EncodeString(in);
return EncodeString(CryptStr);
}
//---------------------------------------------------------------------------
UnicodeString TForm1::DeCrypt(UnicodeString in)
{
UnicodeString DeCryptStr;
DeCryptStr=DecodeString(in);
return DecodeString(DeCryptStr);

}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{

Edit2->Text=Crypt(Edit1->Text);
Edit3->Text=DeCrypt(Edit2 ->Text);
}
//---------------------------------------------------------------------------


Вариант № 2 - чуток по-сложнее с применением магического квадрата и Base64

#include <fmx.h>
#pragma hdrstop

#include "Unit1.h"
#include <Soap.EncdDecd.hpp>
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
// ---------------------------------------------------------------------------
int MagicSquare[25] = { 12, 6, 24, 19, 4, 10, 7, 3, 23, 22, 0, 11, 15, 1, 13, 16, 21, 5, 14, 9, 2,20, 18, 8, 17};

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}

// ---------------------------------------------------------------------------
UnicodeString TForm1::Crypt(UnicodeString in) {
if (in.Length()>=25) {
ShowMessage("Длинна строки >=25 символов\nРаботать не будем");
return "";
}
 UnicodeString str;
 int strLen = in.Length();
 TStringBuilder *strIn = new TStringBuilder(in);
 TStringBuilder *strOut = new TStringBuilder(25);
 for (int i = 0; i < 25; i++) {
  strOut->Append(UnicodeString(_D("0")));
 }

 for (int i = 0; i < strIn->Length; i++) {
  strOut->Replace(UnicodeString(_D("0")), UnicodeString(strIn->Chars[i]), IndexInArrey(i), 1);
 }
  for (int i = 0; i < 25; i++)
  {
  if (strOut->Chars[i]=='0')
  strOut->Replace("0",UnicodeString((char)MagicSquare[i]),i,1);
  }

 for (int i = 0; i < 25; i++) {
  str = str + UnicodeString(strOut->Chars[i]);
 }


 UnicodeString strLenSim=EncodeString(UnicodeString((char)in.Length()));

 str = EncodeString(str);
 str = EncodeString(str);

 str = strLenSim+str;
 strIn->Free();
 strOut->Free();
 strLen = NULL;
 strLenSim = NULL;
 return str;

}

// ---------------------------------------------------------------------------
UnicodeString TForm1::DeCrypt(UnicodeString in) {
if (in.Length()>0)
{
 UnicodeString str;
 UnicodeString strLenSim=UnicodeString(DecodeString(in.SubString0(0,4)));


 int strLen=(int)strLenSim.c_str()[0];
 in=in.Delete0(0,4);
 in = DecodeString(in);
 in = DecodeString(in);


 TStringBuilder *strIn = new TStringBuilder(in);

 for (int i = 0; i < strLen; i++) {

   str = str + UnicodeString(strIn->Chars[IndexInArrey(i)]);


 }

 strIn->Free();
 strLenSim = NULL;
 return str;
}
else return "";

}

// ---------------------------------------------------------------------------
int TForm1::IndexInArrey(int index) {
 int ret_index = 0;
 for (int i = 0; i < 25; i++) {

  if (MagicSquare[i] == index) {
   return ret_index;
  }
  ret_index++;
 }

}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
 Memo2->Lines->Clear();
 Edit2->Text = Crypt(Edit1->Text);
 Edit3->Text = DeCrypt(Edit2->Text);

}
// ---------------------------------------------------------------------------


Комментариев нет:

Отправить комментарий