Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация rc4 на Delphi, траблы с шифрованием предложений 
V
    Опции темы
инноочка
Дата 5.7.2013, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 5.7.2013

Репутация: нет
Всего: нет



реализовала код, но однако не во всех случаях получается нужное-обрезает. smile  smile  smile 
выявила, что это происходит, если на вход даешь несколько предложений

http://s1.ipicture.ru/uploads/20130705/RUrTVVej.png
вводим текст, который хотим шифровать

http://s1.ipicture.ru/uploads/20130705/Vj6lV9Ih.png
и вот что происходит с текстом после шифрования

однако, если заменить Enter  на пробел, то получится вот так smile  smile 
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, ну или это все вместе smile а еще может быть что-то другое

пожалуйста, подскажите, что не так и, если можно, как это исправить. В криптографии новичок.

Это сообщение отредактировал(а) инноочка - 5.7.2013, 19:24

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  ARC4.zip 218,84 Kb
PM MAIL   Вверх
northener
Дата 5.7.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(инноочка @  5.7.2013,  18:57 Найти цитируемый пост)
либо траблы из-за мемо

Наверняка из-за мемо. Окно для ввода/вывода текстовой информации не подходит для хранения "мусора". Уж "обрезание" - 100% из-за этого. Как только в "мусоре" встречается символ #0, так весь дальнейший мусор отбрасывается. Храните зашифрованную информацию в строке (тип string). И да пребудет вам щасьте!
А чтобы не беспокоиться о Chr и Ord (если у вас Д2009+), просто везде замените string на AnsiStringChar на AnsiChar.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
инноочка
Дата 7.7.2013, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 5.7.2013

Репутация: нет
Всего: нет



Цитата(northener @ 5.7.2013,  19:38)
Наверняка из-за мемо. Окно для ввода/вывода текстовой информации не подходит для хранения "мусора". Уж "обрезание" - 100% из-за этого. Как только в "мусоре" встречается символ #0, так весь дальнейший мусор отбрасывается. Храните зашифрованную информацию в строке (тип string). И да пребудет вам щасьте!
А чтобы не беспокоиться о Chr и Ord (если у вас Д2009+), просто везде замените string на AnsiStringChar на AnsiChar.

благодарю за совет, надеюсь, что это решит проблему)
PM MAIL   Вверх
инноочка
Дата 9.7.2013, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 5.7.2013

Репутация: нет
Всего: нет



подправила код, немного изменила дизайн(в архиве готовая программа) если будет что-то не понятно-пишите в личку.

программа рабочая))

Это сообщение отредактировал(а) инноочка - 11.7.2013, 15:00

Присоединённый файл ( Кол-во скачиваний: 120 )
Присоединённый файл  ARC4.zip 224,27 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.