Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Delphi: Полиалфавитный шифр Виженера


Автор: Solominka 24.10.2010, 13:59
В общем возникла такая проблема: нужно написать программу на Делфи с использованием этого самого полиалфавитного шифра Виженера.
НО! Это не тот алгоритм, который на каждом шагу валяется. Тут немного другой принцип  и я если честно не очень то понимаю как это реализовать.

Вот так прога должна выглядеть в итоге:

http://ipicture.ru/Gallery/Viewfull/1698686.html

Помогите пожалуйста реализовать!  smile 

Автор: Solominka 24.10.2010, 16:40
Неужели даже с алгоритмом совсем некому помочь? :(

Автор: amsoft 24.10.2010, 17:36
А что конкретно у тебя не получается?
Ничего сложного не вижу. В качестве таблицы для шифрования используй компонент TStringGrid, программно заполняй ее буквами и в процессе шифрования пробегай по всему тексту, подставляя соответствующие буквы из таблицы.
Или тебе готовый код нужен?

Автор: Solominka 24.10.2010, 17:42
Ну компоненты то я и так вижу, какие нужны...
Только я без понятия, что сначала объявить и как это заполнить...
Я не понимаю, как именно прога работать должна... Т.е. что и из каких соображений перебирать...

Цитата

Или тебе готовый код нужен? 


А кому ж он не нужен! =__=

Но на готовый код я не рассчитываю, ибо это за меня писать никто не будет.
Мне бы хотя бы объяснили, что и как написать, а там я уж сама бы как-нибудь может написала.
Ибо мне даже сам принцип шифрования не ясен.

Автор: Specialistvlad 24.10.2010, 17:49
Аналогично, ничего сложного нету. Тебе не программу нужно написать, а сначала алгоритм составить. Исходя из твоего сообщения, кажется, что ты просто не хочешь этого делать.

Алгоритм довольно прост. Так на вскидку: есть таблица, с исходными данными, по пересечению ячеек нужно находить нужную букву и подставлять её в цикле.

Автор: amsoft 24.10.2010, 18:04
Составляем таблицу для шифрования:

первая строка - алфавит (можно заполнить программно, пробежавшись по ячейкам и заполняя их символами, в этом тебе может помочь функция Chr(x) - первый символ будет Chr(224) - буква 'а', второй - Chr(225) и т.д. до Chr(255) - буква 'я')
Остальные строки заполняешь аналогично, только начинать будешь не с символа Chr(224), а с символа 'ш' (код буквы можно узнать с помощью функции Ord('ш')), таким образом вторая ячейка будет содержать символ Chr(Ord('ш')+1) и так далее, пока не дойдешь до 'я', затем начинаешь опять с Chr(224)...
Надеюсь, выразился правильно.

Далее можно переходить непосредственно к шифрованию.

Автор: Solominka 24.10.2010, 18:05
Цитата

и подставлять её в цикле. 


в каком цикле? =__=

Цитата

Исходя из твоего сообщения, кажется, что ты просто не хочешь этого делать.


Ну не понимаю я... НЕ ПОНИМАЮ! уж извините...

Добавлено через 1 минуту и 6 секунд
amsoft, кажется начинаю понимать, спасибо)

Автор: amsoft 24.10.2010, 18:19
Solominka, 
если будут вопросы, выкладывай сюда свой код, будем разбираться  smile 

Автор: Solominka 24.10.2010, 19:48
В общем нашла похожий программный код, попыталась преобразовать, но запуталась и заполняет оно всё не совсем так, как надо...
Вот исходник для наглядности:
http://www.sendspace.com/file/9qgieb

Сам код:

Код

var
  Form1: TForm1;
  alfvt, kluch, sms, brr: String;
  i, j, g,l, raz, ind, n, dlina_alfvt, dlina_kluch, dlina_sms,dlina_bez_probl: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  alfvt:= 'абвгдежзийклмнопрстуфхцчшщъыьэюя';
  kluch:= Edit1.Text;
  sms:= Edit2.Text;
  ind:= 0;
  n:= 0;
  dlina_bez_probl:=0;
  dlina_alfvt:= length(alfvt);
  dlina_kluch:= length(kluch);
  dlina_sms:= length(sms);

  for j:= 0 to Dlina_alfvt-1 do
  begin
    StringGrid1.Cells[j, 0]:= alfvt[j+1];
  end;

  for i:= 1 to Dlina_kluch do
  begin
    StringGrid1.Cells[0, i]:= kluch[i];
  end;

  for i:= 1 to Dlina_kluch do
  begin
    for j:= 1 to Dlina_alfvt do
    begin
      if StringGrid1.Cells[0, i] = alfvt[j] then
      begin
        raz:= 0;
        for g:= 1 to Dlina_alfvt-j do
        begin
          StringGrid1.Cells[g, i]:= alfvt[g+j];
          raz:= raz + 1;
        end;
        for g:= Dlina_alfvt-j+1 to Dlina_alfvt-1 do
        begin
          StringGrid1.Cells[g, i]:= alfvt[g-raz];
        end;
      end;
    end;
  end;

  raz:=0;
  For j:= 0 to Dlina_sms-1 do
  Begin
    if j + 1 = raz + 1 + n*Dlina_kluch then
    begin
      StringGrid2.Cells[j, 1]:= IntToStr(raz + 1);
      StringGrid2.Cells[j, 2]:= kluch[raz + 1];
    end;

    if sms[j+1] <> ' ' then
    begin
      StringGrid2.Cells[ind,1]:= sms[j+1];
      ind:= ind + 1;
      dlina_bez_probl:= dlina_bez_probl + 1;
    end;
    raz:= raz + 1;
    if raz = 4 then
    begin
      n:= n+1;
      raz:=0;
    end;
  end;

  g:=1;
  for j:= 0 to dlina_bez_probl-1 do
  begin
    if StringGrid2.Cells[j, 1] = kluch[g] then
    begin
      for i:= 0 to dlina_alfvt-1 do
      begin
       if StringGrid2.Cells[j, 2]= StringGrid1.Cells[i, 0] then
       begin
         StringGrid2.Cells[j, 3]:= StringGrid1.Cells[i, g];
         if g = 4 then g:= 0;
         g:=g+1;
       end;
      end;
    end;
  end;

  brr:= '';
  for j:=0 to dlina_bez_probl-1 do
  begin
    brr:= brr + StringGrid2.Cells[j,3];
  end;
  Edit3.Text:= brr;
  Edit4.Text:= kluch;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  brr:= Edit3.Text;
  kluch:= Edit4.Text;

  for j:= 0 to dlina_bez_probl do
  begin
    StringGrid3.Cells[j, 0]:= brr[j+1];
  end;

  n:=0;raz:=0;
  For j:= 0 to dlina_bez_probl-1 do
  Begin
    if j + 1 = raz + 1 + n*Dlina_kluch then
    begin
      StringGrid4.Cells[j, 0]:= IntToStr(raz + 1);
      StringGrid4.Cells[j, 1]:= kluch[raz + 1];
    end;
    raz:= raz + 1;
    if raz = 4 then
    begin
      n:= n+1;
      raz:=0;
    end;
  end;

  for j:= 0 to Dlina_alfvt-1 do
  begin
    StringGrid3.Cells[j, 2]:= alfvt[j+1];
  end;

  for i:= 1 to Dlina_kluch do
  begin
    StringGrid4.Cells[0, i]:= kluch[i];
  end;

  for i:= 1 to Dlina_kluch do
  begin
    for j:= 1 to Dlina_alfvt do
    begin
      if StringGrid4.Cells[0, i] = alfvt[j] then
      begin
        raz:= 0;
        for g:= 1 to Dlina_alfvt-j do
        begin
          StringGrid4.Cells[g, i]:= alfvt[g+j];
          raz:= raz + 1;
        end;
        for g:= Dlina_alfvt-j+1 to Dlina_alfvt-1 do
        begin
          StringGrid4.Cells[g, i]:= alfvt[g-raz];
        end;
      end;
    end;
  end;

  g:=1;
  for j:= 0 to dlina_bez_probl-1 do
  begin
    if StringGrid4.Cells[j, 0] = kluch[g] then
    begin
      for i:= 0 to dlina_alfvt-1 do
      begin
       if StringGrid3.Cells[j, 0]= StringGrid4.Cells[i, g] then
       begin
         StringGrid4.Cells[j, 1]:= StringGrid4.Cells[i, 0];
         if g = 4 then g:= 0;
         g:=g+1;
         Break;
       end;
      end;
    end;
  end;

  brr:= '';
  for j:=0 to dlina_bez_probl-1 do
  begin
    brr:= brr + StringGrid4.Cells[j,1];
  end;
  Edit5.Text:= brr;

end;
end.


Автор: Specialistvlad 24.10.2010, 23:56
Да не нужно чужое находить. Напиши свое, поймешь хоть тогда. А совет как понять. Возьми листочек и пиши посделовательность действий, которая по твоему мнению нужна для выполнении программы. Например. Первое: Выставить ряд букв исходя из шифра. Следующее, и так далее... И только когда у тебя будет правильный алгоритм, ты с легкостью поймешь, что делать.
Давай вместе составлять, но только если это не подразумевает по собой напиши мне....

Автор: Solominka 25.10.2010, 00:24
Specialistvlad, писать уже ничего не нужно (как минимум потому, что написано уже, выше).

Нужно просто сделать так, чтобы из четырёх  StringGrid-ов всё выводилось в один, и всё =__=
Чем я сейчас и занимаюсь (и потихоньку получается).

Ибо писать с нуля - не располагаю временем, увы и ах, т.к. для этого я Делфи знаю довольно плохо, что уж тут скрывать. И в данном случае при таком раскладе, мне быстрее доделать немного чужой исходник, чем пытаться составить свой алгоритм, который я пойму неизвестно после какой по счёту попытки, потом объявить кучу функций и не запутаться в них же, родимых...
Извините, но когда авраал - тут не до качества, к сожалению...

Благодарю за предложенную помощь с алгоритмом, но обратись я раньше хотя бы дня на 3 - это возможно, имело бы для меня какой-то реальный смысл.

Автор: casinosoftguru 25.10.2010, 13:40
советую повнимательнее рассмотреть пример там левые какие то переменные типа Sms или brr они с твоим скриншотом никак не сходятся..
достаточно будет расписать не на бумажке а в комментариях к коду каждое действие и тогда станет все понятно что тебе нужно из этого кода а что не нужно)

Автор: Solominka 25.10.2010, 14:02
casinosoftguru, просто прога была с 8-ю гридами, а надо "собрать" всё в 4 грида, плюс порядок слегка другой...
А принцип тот же))
А переменные эти там как бы нужны)))

Короче из этого: http://ipicture.ru/Gallery/Viewfull/1713919.html надо сделать это http://ipicture.ru/Gallery/Viewfull/1698686.html.

Только и всего 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)