не могу понять где ошибка шифрует и расшифровывает правильно только несколько строк а остальные как-будто обрезает. помогите пожалуйста кому не в лом разобраться с этой проблемой а то курсач горит
Alexteks@mail.ru
Код:
unit frmMain_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmMain = class(TForm)
memText: TMemo;
btnOpenFile: TButton;
btnEncDec: TButton;
btnSaveToFile: TButton;
btnClearText: TButton;
lblPathToFile: TLabel;
edtPathToFile: TEdit;
odOpenFile: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure btnOpenFileClick(Sender: TObject);
procedure btnSaveToFileClick(Sender: TObject);
procedure btnEncDecClick(Sender: TObject);
procedure btnClearTextClick(Sender: TObject);
function ApplyRC4ToText(tx: AnsiString): AnsiString;
function InitRC4Cipher: Boolean;
function GetRC4CharCiphered(ch: AnsiChar): AnsiChar;
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
s: array [0..255] of Byte;
i,j: Byte;
implementation
//uses frmProgress_;
{$R *.dfm}
//Инициализация S-бокса в зависимости от ключа
function TfrmMain.InitRC4Cipher: Boolean;
var
x: AnsiString;
k: array [0..255] of Byte;
t: Byte;
l: Cardinal;
i0,j0: Byte;
begin
x := InputBox('RC4','Введите ключ','');
if x = '' then
begin
ShowMessage('Вы не ввели ключ.');
Result := false;
Exit;
end;
for i0 := 0 to 255 do s[i0] := i0;
j0 := 1; l := sizeof(x);
for i0 := 0 to 255 do
begin
k[i0] := Ord(x[j0]);
if j0 = l then j0 := 1;
Inc(j0);
end;
for i0 := 0 to 255 do
begin
j0 := (j0 + k[i0] + s[i0]) mod 256;
t := s[i0];
s[i0] := s[j0];
s[j0] := t;
end;
i := 0;
j := 0;
Result := true;
end;
//Шифрование конкретного символа
function TfrmMain.GetRC4CharCiphered(ch: AnsiChar): AnsiChar;
var
t: Byte;
begin
i := (i + 1) mod 256;
j := (j + s[i]) mod 256;
t := s[i];
s[i] := s[j];
s[j] := t;
t := (s[i] + s[j]) mod 256;
Result := Chr(Ord(ch) XOR s[t]);
end;
//функция шифрования всего текста
function TfrmMain.ApplyRC4ToText(tx: AnsiString): AnsiString;
var
i: Cardinal;
x: AnsiString;
begin
if InitRC4Cipher = false then
begin
Result := tx;
Exit;
end;
Result := '';
for i := 1 to Length(tx) do
Result := Result + GetRC4CharCiphered(tx[i]);
end;
//Открыть файл
procedure TfrmMain.btnOpenFileClick(Sender: TObject);
begin
if odOpenFile.Execute = false then Exit;
memText.ReadOnly := false;
edtPathToFile.Text := odOpenFile.FileName;
memText.Lines.LoadFromFile(edtPathToFile.Text);
end;
//Сохраняем в файл
procedure TfrmMain.btnSaveToFileClick(Sender: TObject);
begin
memText.Lines.SaveToFile(odOpenFile.FileName);
ShowMessage('Сохранение прошло успешно');
end;
//Шифрование данных
procedure TfrmMain.btnEncDecClick(Sender: TObject);
begin
if memText.Lines.Text <> '' then
memText.Lines.Text := ApplyRC4ToText(memText.Lines.Text)
else
begin
ShowMessage('Поле ввода пусто.');
Exit;
end;
end;
//Вывод исходного текста
procedure TfrmMain.btnClearTextClick(Sender: TObject);
begin
if memText.Lines.Text <> '' then
memText.Lines.LoadFromFile(edtPathToFile.Text)
else
ShowMessage('Нужно открыть сначала файл!!!');
end;
end.