Delphi: Полиалфавитный шифр Виженера

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

Неужели даже с алгоритмом совсем некому помочь? :(


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


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


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


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


и подставлять её в цикле. 
в каком цикле? =__=
Исходя из твоего сообщения, кажется, что ты просто не хочешь этого делать.
Ну не понимаю я... НЕ ПОНИМАЮ! уж извините...Добавлено через 1 минуту и 6 секундamsoft, кажется начинаю понимать, спасибо)


Solominka, если будут вопросы, выкладывай сюда свой код, будем разбираться   


В общем нашла похожий программный код, попыталась преобразовать, но запуталась и заполняет оно всё не совсем так, как надо...Вот исходник для наглядности:ИСХОДНИКСам код:
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, писать уже ничего не нужно (как минимум потому, что написано уже, выше).Нужно просто сделать так, чтобы из четырёх  StringGrid-ов всё выводилось в один, и всё =__=Чем я сейчас и занимаюсь (и потихоньку получается).Ибо писать с нуля - не располагаю временем, увы и ах, т.к. для этого я Делфи знаю довольно плохо, что уж тут скрывать. И в данном случае при таком раскладе, мне быстрее доделать немного чужой исходник, чем пытаться составить свой алгоритм, который я пойму неизвестно после какой по счёту попытки, потом объявить кучу функций и не запутаться в них же, родимых...Извините, но когда авраал - тут не до качества, к сожалению...Благодарю за предложенную помощь с алгоритмом, но обратись я раньше хотя бы дня на 3 - это возможно, имело бы для меня какой-то реальный смысл.


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


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