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