Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Шифрование с помощью таблицы Виженера


Автор: eLRiz 10.2.2012, 16:21
Всем привет. Очень нужна ваша помощь. Реализовать нужно шифрование с помощью таблицы Виженера, при этом используя StringGrid, и 3 поля ввода (исходное слово, ключ, результат). Вообщем шифрование сделал, там вроде всё более менее ясно. И вот уже целый день сижу с дешифрованием, всё как-то не так работает. В чем проблема понять не могу  smile 

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    Button1: TButton;
    Button2: TButton;
    LabeledEdit3: TLabeledEdit;
    procedure StringGrid1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1Click(Sender: TObject);
var I, J : integer;
  S : string;
  V : string;
begin
  S := 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя';
  for I := 0 to 32 do
  begin
    for J := 0 to 32 do
    begin
      StringGrid1.Cells[J, I] := S[J+1];
    end;
    V := S[1];
    delete( S, 1, 1 );
    insert( V, S, 33 );
  end;
end;


function shifr( AKey : Integer ) : string;
var Keyword, NewS : string;
  I, J, P, P2, L, K : integer;
begin
  Form1.LabeledEdit2.Text := '';
  Keyword := Form1.LabeledEdit3.Text;
  if AKey = 1 then
  begin
    {Шифрование}
    L := 1;
    for I := 1 to length( Form1.LabeledEdit1.Text ) do
    begin
      if Form1.LabeledEdit1.Text[I] <> ' ' then
      begin
        P := 0;
        P2 := 0;
          for J := 0 to 32 do
          begin
            if Form1.StringGrid1.Cells[0, J] = Form1.LabeledEdit1.Text[I] then
              P := J;
            if Form1.StringGrid1.Cells[J, 0] = Keyword[L] then
                P2 := J;
          end;
          Form1.LabeledEdit2.Text := Form1.LabeledEdit2.Text + Form1.StringGrid1.Cells[P2, P];
        if L >= length( Keyword ) then
                L := 1
              else
                L := L + 1;
      end;
    end;
  end
  else
  begin
    {Дешифрование}
    L := 1;
    for I := 1 to length( Form1.LabeledEdit1.Text ) do
    begin
      if Form1.LabeledEdit1.Text[I] <> ' ' then
      begin
        P := 0;
        P2 := 0;
          for J := 0 to 32 do
          begin
            if Form1.StringGrid1.Cells[0, J] = Form1.LabeledEdit1.Text[I] then
            begin
              P := J;
              for K := 0 to 32 do
              begin
                if Form1.StringGrid1.Cells[K, P] = Keyword[L] then
                P2 := K;
              end;
           end;
          end;
          Form1.LabeledEdit2.Text := Form1.LabeledEdit2.Text + Form1.StringGrid1.Cells[P2, 0];
          if L >= length( Keyword ) then
            L := 1
          else
            L := L + 1;
      end;
    end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  shifr( 1 );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  shifr( 2 );
end;

end.


Прикладываю файл с исходниками, чтоб проще было посмотреть

Автор: eLRiz 12.2.2012, 17:38
Нашёл сам ошибку. Поэтому спасибо eLRiz, что помог  smile 

В коде строки с 95 по 103 включительно, необходимо заменить на:
Код

if Form1.StringGrid1.Cells[0, J] = Form1.LabeledEdit1.Text[I] then
begin
     P := J;
     for K := 0 to 32 do
     begin
          if Form1.StringGrid1.Cells[K, P] = Keyword[L] then
              P2 := K;
     end;
end;


 smile  smile  smile  smile  smile  smile  smile 

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