Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Зашифровка текста методом Вижинера 
:(
    Опции темы
Morgenstern
Дата 24.12.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите найти ошибку,ибо я уже окончательно в тупике. В общем нужно в одной программе с помошью четырёхбуквенного ключа методом Вижинера зашифровать и расшифровать текст. Дешифровка у меня работает, но вот само шифрование... короче, проблему укажу непосредственно в коде. Помогите пожалуйста!:

Код

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Memo2: TMemo;
    Button3: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ListBox1: TListBox;
    sg1: TStringGrid;
    Button4: TButton;
    Memo3: TMemo;
    Memo4: TMemo;
    Edit2: TEdit;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    OpenDialog2: TOpenDialog;
    SaveDialog2: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  alp: array [0..31] of char =('А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л',
                               'М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч',
                               'Ш','Щ','Ы','Ь','Э','Ю','Я',' ');

implementation

{$R *.dfm}

function TakeNum(a: char): integer; //фунукция получения номера
var i: integer;
begin
 Result:=-1;
 for i:=0 to 31 do
  if a=alp[i] then
   begin
    result:=i;
    break;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
 OpenDialog1.Execute;
 if FileExists(OpenDialog1.FileName) then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 SaveDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
 SaveDialog1.Execute;
 if Length(SaveDialog1.FileName)>0 then Memo2.Lines.SaveToFile(SaveDialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j,k: integer; key,str: string;
begin
 key:=Edit1.Text;
 k:=1;
 Memo2.Clear;
 ListBox1.Clear;
 for j:=0 to Memo1.Lines.Count-1 do
 begin
  k:=1;
  str:=Memo1.Lines[j];
  for i:=1 to Length(str) do
  begin
   ListBox1.Items.Add(str[i]+'('+IntToStr(TakeNum(str[i]))+') - '+key[k]+'('+IntToStr(TakeNum(key[k]))+') = '+IntToStr((TakeNum(str[i])+(32-TakeNum(key[k]))) mod 32)+' |'+alp[((TakeNum(str[i])+(32-TakeNum(key[k]))) mod 32)]+'|');
   str[i]:=alp[((TakeNum(str[i])+(32-TakeNum(key[k]))) mod 32)];
   if k<Length(key) then Inc(k) else k:=1;
  end;
  Memo2.Lines.Add(str);
 end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var i,j,max, c: integer; s: array [0..31] of integer; str: string;
begin
 for c:=1 to 4 do
begin
 for i:=0 to 31 do s[i]:=0;

 for j:=0 to Memo1.Lines.Count-1 do
 begin
  str:=Memo1.Lines[j];
  for i:=1 to Length(str) do
  begin
   if c=4 then
    begin if ((i mod 4) = 0) then s[TakeNum(str[i])]:=s[TakeNum(str[i])]+1; end else
   if ((i mod 4) = c) then s[TakeNum(str[i])]:=s[TakeNum(str[i])]+1;
  end;
 end;

// showmessage('c='+IntToStr(c));

 max:=s[0]; j:=0;
 for i:=0 to 31 do
  if (s[i]>max) then
   begin
    max:=s[i];
    j:=i;
   end;

 ListBox1.Clear;
 for i:=0 to 31 do ListBox1.Items.Add(alp[i]+' '+IntToStr(s[i]));
 str:='';
 for i:=0 to 31 do str:=str+(alp[i]+' '+IntToStr(s[i]))+#13#10;
// showmessage(str);
 str:=alp[(j+(32-TakeNum(' ')) mod 32)];
 sg1.Cells[c-1,0]:=str;
end;

end;


procedure TForm1.Button6Click(Sender: TObject);
begin
// OpenDialog2.InitialDir:=ExtractFilePath(Application.ExeName);
 OpenDialog2.Execute;
 if FileExists(OpenDialog2.FileName) then Memo3.Lines.LoadFromFile(OpenDialog2.FileName);
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
 //SaveDialog2.InitialDir:=ExtractFilePath(Application.ExeName);
 SaveDialog2.Execute;
 if Length(SaveDialog2.FileName)>0 then Memo4.Lines.SaveToFile(SaveDialog2.FileName);
end;

procedure TForm1.Button5Click(Sender: TObject); //функция шифрования!
var i,j,tt,k,t1,t2: integer;
 key,str,STR1: string;
begin
 key:=Edit2.Text;
 k:=0;
 Memo4.Clear;
 for j:=0 to Memo3.Lines.Count-1 do
 begin
  str:=Memo3.Lines[j];
  str1:='';
  K:=0;
  for i:=1 to Length(str) do
  begin
   str1[i]:=alp[(TakeNum(str[i])+TakeNum(key[k+1]))mod 32]; //в общем тут и главные трабл. Почему-то строка невозвращает никаких значений. Ни номера буквы, ни изменного, ни вообще ничего. Я в тупике. Эта же функция в обратном порядке спокойно дешифрует тот же текст.....
   k:=(k+1) mod 4;
  end;
  Memo4.Lines.Add(str1);
 end;
end;

end.
                                                          
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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