реализовала код, но однако не во всех случаях получается нужное-обрезает. выявила, что это происходит, если на вход даешь несколько предложений
http://s1.ipicture.ru/uploads/20130705/RUrTVVej.png вводим текст, который хотим шифровать
http://s1.ipicture.ru/uploads/20130705/Vj6lV9Ih.png и вот что происходит с текстом после шифрования
однако, если заменить Enter на пробел, то получится вот так http://s1.ipicture.ru/uploads/20130705/QPfb2T2d.png
ну и собственно код программы
| Код | unit ARC4_Unit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TRC4_Unit = class(TForm) Memo_Text1: TMemo; btnOpenFile: TButton; btnRC4: TButton; btnSaveToFile: TButton; lblPathToFile: TLabel; Edit_PathToFile: TEdit; OpenFile1: TOpenDialog; SaveFile: TSaveDialog; Memo_Text2: TMemo; lblTextToRead: TLabel; btnClr: TButton; lblTextForRead: TLabel;
procedure btnOpenFileClick(Sender: TObject); procedure btnSaveToFileClick(Sender: TObject); procedure btnClrClick(Sender: TObject); procedure btnRC4Click(Sender: TObject);
function ApplyRC4ToText(tx: String): String; function InitRC4Encryption: Boolean; function GetRC4CharEncryption(ch: Char): Char;
private { Private declarations } public { Public declarations } end;
var RC4_Unit: TRC4_Unit; s: array [0..255] of Byte; i2,j2: Byte;
implementation {$R *.dfm} //Инициализация S-блока в зависимости от ключа: алгоритм использует ключ, // который подается на вход пользователем, сохраненный в , //и имеющий длину байт. инициализация начинается с заполнения массива, //далее этот массив перемешивается путем перестановок, определяемых ключом.
function TRC4_Unit.InitRC4Encryption: Boolean; var KEY: String; k: array [0..255] of Byte; t: Byte; l: Cardinal; i1,j1: Byte;
begin KEY := InputBox('RC4','Введите ключ','');
if KEY = '' then begin ShowMessage('Вы не ввели ключ.'); Result := false; Exit; end;
for i1 := 0 to 255 do s[i1] := i1;
j1 := 1; l := Length(KEY); for i1 := 0 to 255 do begin k[i1] := Ord(KEY[j1]); //функция Ord(ARG) возвращает целочисленное значение для любого перечисляемого типа ARG if j1 = l then j1 := 1; Inc(j1); end;
for i1 := 0 to 255 do begin j1 := (j1 + k[i1] + s[i1]) mod 256;
t := s[i1]; s[i1] := s[j1]; s[j1] := t; end; i2 := 0; j2 := 0; Result := true; end;
//Шифрование символа function TRC4_Unit.GetRC4CharEncryption(ch: Char): Char; var t: Byte;
begin //генерация i2 := (i2 + 1) mod 256; j2 := (j2 + s[i2]) mod 256; //меняем местами s[i2] и s[j2] t := s[i2]; s[i2] := s[j2]; s[j2] := t;
t := (s[i2] + s[j2]) mod 256;
Result := Chr(Ord(ch) XOR s[t]); // функция Chr(VALUE) конвертирует число // VALUE или в AnsiChar или в WideChar end;
//функция шифрования всего текста, находящегося в Memo_Text1 function TRC4_Unit.ApplyRC4ToText(tx: String): String; var i: Cardinal;
begin if InitRC4Encryption = false then begin //если ключ не введен, то присвоим исходную строку //и завершим выполнение функции
Result := tx; Exit; end; Result := ''; for i := 1 to Length(tx) do Result := Result + GetRC4CharEncryption(tx[i]); // в данной строчке каждый символ входной строчки шифруем с помощью функции end;
//Открываем файл procedure TRC4_Unit.btnOpenFileClick(Sender: TObject); begin if OpenFile1.Execute = false then Exit;
Memo_Text1.ReadOnly := false; Edit_PathToFile.Text := OpenFile1.FileName; //записываем в путь файла, который мы открываем OpenFile1
Memo_Text1.Lines.LoadFromFile(Edit_PathToFile.Text); //помещаем в Memo_Text1 текст файл с путем Edit_PathToFile.Text
end; //Сохраняем в файл
procedure TRC4_Unit.btnSaveToFileClick(Sender: TObject); begin Memo_Text2.Lines.SaveToFile('crack.txt'); ShowMessage('Сохранение прошло успешно');
end;
// Шифрование данных: если поле с текстом в Memo_Text1 не пусто, // то произвести шифрование данных и записать полученный текст в Memo_Text2 procedure TRC4_Unit.btnRC4Click(Sender: TObject); begin if Memo_Text1.Lines.Text <> '' then Memo_Text2.Lines.Text := ApplyRC4ToText(Memo_Text1.Lines.Text) else begin ShowMessage('Поле ввода пусто. Введите текст или откройте непустой файл.'); Exit; end;
end;
procedure TRC4_Unit.btnClrClick(Sender: TObject); begin Memo_Text1.Lines.Text := ''; Memo_Text2.Lines.Text := ''; Edit_PathToFile.Text := ''; end;
end.
|
либо траблы из-за мемо, либо из-за функций Chr и Ord, ну или это все вместе а еще может быть что-то другое
пожалуйста, подскажите, что не так и, если можно, как это исправить. В криптографии новичок. |