Объясните программу

kot07
Дата: 26.12.2014 13:23:33
Добрый день, можете объяснить мне что происходит в программе по строчно?
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
AnsiString code;
unsigned char RC4_S[256];
int RC4_i;//Счетчик i
int RC4_j;// Счетчик j
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	t=0;
}
//---------------------------------------------------------------------------
void __fastcall RC4_InitKey(unsigned char* Key, int KeyLength)
{ //key массивключевой информации и массив его длины
	RC4_i = 0;
	RC4_j = 0;// Счетчик обнуляем
	for (int i=0; i<256; i++)// Обнуляем матрицу
		RC4_S[i] = i;
	int j=0;
	for (int i=0; i<256; i++)
	{
		j = (j + Key[i % KeyLength] + RC4_S[i]) % 256;// Изменяем временный счетчик "j" в соответствии с алгоритмом
	 // с использованием ключевой информации
		unsigned char temp = RC4_S[i];// переставляем местами S[i] и S[j]
		RC4_S[i] = RC4_S[j];
		RC4_S[j] = temp;
	}
}
//---------------------------------------------------------------------------
unsigned char __fastcall RC4_Transform(unsigned char nextByte)   //преобразование
{
//---- Параметры:
//----    nextByte      - байт для преобразования
//---- Результат:
//----    преобразованный байт

	RC4_i = (RC4_i + 1) % 256;// Изменяем счетчик "i" в соответствии с алгоритмом
	RC4_j = (RC4_j + RC4_S[RC4_i]) % 256;// Изменяем счетчик "j" в соответствии с алгоритмом
	unsigned char temp = RC4_S[RC4_i];// Переставляем местами S[i] и S[j]
	RC4_S[RC4_i] = RC4_S[RC4_j];
	RC4_S[RC4_j] = temp;
	temp = (RC4_S[RC4_i] + RC4_S[RC4_j]) % 256;// Определяем маску в соответствии с алгоритмом
	return nextByte ^ RC4_S[temp];// Накладываем маску на исходный байт по XOR
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
	AnsiString keysh="";
	keysh=Edit1->Text;
	if (keysh=="")
		MessageDlg("Введите ключ",mtInformation,TMsgDlgButtons()<<mbOK,0);
	else
	{
		code=keysh;
		char* US=new char[Edit1->Text.Length()];
		for(int z=0;z<Edit1->Text.Length();z++)
			US[z]=Edit1->Text[z+1];
		RC4_InitKey(US, Edit1->Text.Length());
		delete []US;
		int in=FileOpen(OpenDialog1->FileName,fmOpenRead);
		int out=FileOpen("C:\MSZI\encoding4.txt",fmOpenWrite);
		unsigned char buffer[4096];
		int readed;
		while(readed=FileRead(in,buffer,4096))
		{
			for (int i=0; i<readed; i++)
				buffer[i] = RC4_Transform(buffer[i]);
			FileWrite(out,buffer,readed);
		}
		FileClose(in);
		FileClose(out);
		Memo2->Lines->LoadFromFile("C:\MSZI\encoding4.txt");
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
	AnsiString keyr="";
	keyr=Edit2->Text;
	if (keyr=="")
		MessageDlg("Введите ключ",mtInformation,TMsgDlgButtons()<<mbOK,0);
	else
	{
		char* US=new char[Edit2->Text.Length()];
		for(int z=0;z<Edit2->Text.Length();z++)
			US[z]=Edit2->Text[z+1];
		RC4_InitKey(US, Edit2->Text.Length());
		delete []US;
		int in=FileOpen(OpenDialog1->FileName,fmOpenRead);
		int out=FileOpen("C:\MSZI\decoding4.txt",fmOpenWrite);
		unsigned char buffer[4096];
		int readed;
		while(readed=FileRead(in,buffer,4096))
		{
			for (int i=0; i<readed; i++)
				buffer[i] = RC4_Transform(buffer[i]);
			FileWrite(out,buffer,readed);
		}
		FileClose(in);
		FileClose(out);
		Memo3->Lines->LoadFromFile("C:\MSZI\decoding4.txt");
		if (keyr!=code)
		{
			t++;
			MessageBox(0,L"Вы ввели неверный ключ.\nРасшифровка некорректна!", L"Внимание", MB_OK);
			if(t==3)
			{
				Blocking();
				MessageBox(0,L"Вы 3 раза ввели неверный ключ.\nПрограмма заблокирована!", L"Внимание", MB_OK);
			}
		}
		else
			t=0;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	if(OpenDialog1->Execute())
	{
	 Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
	}
   //	Memo1->Lines->LoadFromFile("Sourse.txt");
}
//---------------------------------------------------------------------------
void TForm1::Blocking()
{
	Button1->Enabled=false;
	Button2->Enabled=false;
	Button3->Enabled=false;
	Edit1->Enabled=false;
	Edit2->Enabled=false;
	Memo1->Enabled=false;
	Memo2->Enabled=false;
	Memo3->Enabled=false;
}
Dima T
Дата: 26.12.2014 13:39:28
Что конкретно непонятно? Сомневаюсь что кому-то охото комментировать каждую строчку.

Тут какое-то шифрование/дешифрование алгоритмом RC4
MasterZiv
Дата: 26.12.2014 13:58:53
kot07,

я могу только прокомментировать все целиком: какой то дельфовый говнокод.
mayton
Дата: 26.12.2014 14:05:49
Скорее всего автор ожидает некого "живого и яркого" художественного описания
того что делает код.

Неудивительно. Комментарии Кэпа-очевидность не могут не угнетать. Скажите
пожалуйста. Ну кому такое пояснение вообще нужно?

RC4_j = 0;// Счетчик обнуляем


Гораздо важнее описывать общий смысл алгоритма.
wst
Дата: 26.12.2014 17:25:06
Если цепляться к комментарям, то этот поинтереснее будет:
for (int i=0; i<256; i++)// Обнуляем матрицу
		RC4_S[i] = i;
kot07
Дата: 26.12.2014 17:40:21
в целом то я понимаю что шифрирование/дешифрирование происходит...зачем нужны счетчики R[i] и R[j]
mayton
Дата: 26.12.2014 19:00:59
kot07 , закомментарь их и попробуй собрать проект. Компиллятор тебе тут-же подскажет где счётчики используются.
Dima T
Дата: 26.12.2014 20:19:08
kot07
в целом то я понимаю

А в частности что непонятно? Шифратор шифрует, он же дешифрует, алгоритм обратимый до безобразия.
MasterZiv
Дата: 26.12.2014 21:22:19
#include <vcl.h>  // включение файла vcl.h ! Ибо нет бога кроме Дельфи, и VCL -- пророк его.
#pragma hdrstop  // магическая фраза, которую понимают только гуру Дельфи 20-го уровня или аватары
#include "Unit1.h" // включение файла Unit1.h
//---------------------------------------------------------------------------
#pragma package(smart_init)  // магическая фраза, которую понимают только аватары 20-го уровня.
#pragma resource "*.dfm"    // магическая фраза, которую понимают только аватары 10-го уровня. Важно её запомнить, потому что без неё не работает. 
TForm1 *Form1;  // Объявление указателя на объект класса TForm1 
//---------------------------------------------------------------------------

// Далее идут четыре магические строки, которые превращают весь оставшийся код в говно, не смотря на все прежние усилия аватаров 10-го и 20-го уровней.
AnsiString code; 
unsigned char RC4_S[256];
int RC4_i;//Счетчик i
int RC4_j;// Счетчик j

__fastcall TForm1::TForm1(TComponent* Owner)  // конструктор класса TForm1
	: TForm(Owner)
{
	t=0; // присвоение переменной t значения 0
}


// Далее следует тот код, который был превращён в говно...
// Бессмысленно обсуждать достоинства этого кода и утончённый эстетизм
// его создателей, поскольку всё равно всё превращено в говно.

//---------------------------------------------------------------------------
void __fastcall RC4_InitKey(unsigned char* Key, int KeyLength) // 
{ //key массивключевой информации и массив его длины
	RC4_i = 0;
	RC4_j = 0;// Счетчик обнуляем
	for (int i=0; i<256; i++)// Обнуляем матрицу
		RC4_S[i] = i;
	int j=0;
	for (int i=0; i<256; i++)
	{
		j = (j + Key[i % KeyLength] + RC4_S[i]) % 256;// Изменяем временный счетчик "j" в соответствии с алгоритмом
	 // с использованием ключевой информации
		unsigned char temp = RC4_S[i];// переставляем местами S[i] и S[j]
		RC4_S[i] = RC4_S[j];
		RC4_S[j] = temp;
	}
}
//---------------------------------------------------------------------------
unsigned char __fastcall RC4_Transform(unsigned char nextByte)   //преобразование
{
//---- Параметры:
//----    nextByte      - байт для преобразования
//---- Результат:
//----    преобразованный байт

	RC4_i = (RC4_i + 1) % 256;// Изменяем счетчик "i" в соответствии с алгоритмом
	RC4_j = (RC4_j + RC4_S[RC4_i]) % 256;// Изменяем счетчик "j" в соответствии с алгоритмом
	unsigned char temp = RC4_S[RC4_i];// Переставляем местами S[i] и S[j]
	RC4_S[RC4_i] = RC4_S[RC4_j];
	RC4_S[RC4_j] = temp;
	temp = (RC4_S[RC4_i] + RC4_S[RC4_j]) % 256;// Определяем маску в соответствии с алгоритмом
	return nextByte ^ RC4_S[temp];// Накладываем маску на исходный байт по XOR
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
	AnsiString keysh="";
	keysh=Edit1->Text;
	if (keysh=="")
		MessageDlg("Введите ключ",mtInformation,TMsgDlgButtons()<<mbOK,0);
	else
	{
		code=keysh;
		char* US=new char[Edit1->Text.Length()];
		for(int z=0;z<Edit1->Text.Length();z++)
			US[z]=Edit1->Text[z+1];
		RC4_InitKey(US, Edit1->Text.Length());
		delete []US;
		int in=FileOpen(OpenDialog1->FileName,fmOpenRead);
		int out=FileOpen("C:\MSZI\encoding4.txt",fmOpenWrite);
		unsigned char buffer[4096];
		int readed;
		while(readed=FileRead(in,buffer,4096))
		{
			for (int i=0; i<readed; i++)
				buffer[i] = RC4_Transform(buffer[i]);
			FileWrite(out,buffer,readed);
		}
		FileClose(in);
		FileClose(out);
		Memo2->Lines->LoadFromFile("C:\MSZI\encoding4.txt");
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
	AnsiString keyr="";
	keyr=Edit2->Text;
	if (keyr=="")
		MessageDlg("Введите ключ",mtInformation,TMsgDlgButtons()<<mbOK,0);
	else
	{
		char* US=new char[Edit2->Text.Length()];
		for(int z=0;z<Edit2->Text.Length();z++)
			US[z]=Edit2->Text[z+1];
		RC4_InitKey(US, Edit2->Text.Length());
		delete []US;
		int in=FileOpen(OpenDialog1->FileName,fmOpenRead);
		int out=FileOpen("C:\MSZI\decoding4.txt",fmOpenWrite);
		unsigned char buffer[4096];
		int readed;
		while(readed=FileRead(in,buffer,4096))
		{
			for (int i=0; i<readed; i++)
				buffer[i] = RC4_Transform(buffer[i]);
			FileWrite(out,buffer,readed);
		}
		FileClose(in);
		FileClose(out);
		Memo3->Lines->LoadFromFile("C:\MSZI\decoding4.txt");
		if (keyr!=code)
		{
			t++;
			MessageBox(0,L"Вы ввели неверный ключ.\nРасшифровка некорректна!", L"Внимание", MB_OK);
			if(t==3)
			{
				Blocking();
				MessageBox(0,L"Вы 3 раза ввели неверный ключ.\nПрограмма заблокирована!", L"Внимание", MB_OK);
			}
		}
		else
			t=0;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	if(OpenDialog1->Execute())
	{
	 Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
	}
   //	Memo1->Lines->LoadFromFile("Sourse.txt");
}
//---------------------------------------------------------------------------
void TForm1::Blocking()
{
	Button1->Enabled=false;
	Button2->Enabled=false;
	Button3->Enabled=false;
	Edit1->Enabled=false;
	Edit2->Enabled=false;
	Memo1->Enabled=false;
	Memo2->Enabled=false;
	Memo3->Enabled=false;
}
egorych
Дата: 27.12.2014 12:21:36
...
#pragma hdrstop  // магическая фраза, которую понимают только гуру Дельфи 20-го уровня или аватары
...
так в стройке включается precompiled headers, ничего военного.
И врядли гуру Дельфи понимают эту строчку, кстати )))

...
// Далее идут четыре магические строки, которые превращают весь оставшийся код в говно, не смотря на все прежние усилия аватаров 10-го и 20-го уровней.
AnsiString code; 
unsigned char RC4_S[256];
int RC4_i;//Счетчик i
int RC4_j;// Счетчик j
...
о да!