№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); } // ---------------------------------------------------------------------------
Комментариев нет:
Отправить комментарий