Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Объекты   Найти похожие ветки 

 
News   (2006-05-12 22:59) [0]

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

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm2 = class(TForm)
 Button1: TButton;
 Button2: TButton;
 Memo1: TMemo;
 Button3: TButton;
 procedure Button3Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 private
   { Private declarations }

 public
   { Public declarations }
end;

const matr: array [1..8,1..8] of char=(("ш","Ш","и","И","ф","Ф","р","Р"),
                                       ("п","П","л","Л","е","Е","а","А"),
                                       ("б","Б","в","В","г","Г","д","Д"),
                                       ("ж","Ж","з","З","й","Й","к","К"),
                                       ("м","М","н","Н","о","О","с","С"),
                                       ("т","Т","у","У","х","Х","ц","Ц"),
                                       ("ч","Ч","щ","Щ","ы","ь","э","Э"),
                                       ("ю","Ю","я","Я",",","."," ","-"));

     code="шШиИфФрРпПлЛеЕаАбБвВгГдДжЖзЗйЙкКмМнНоОсСтТуУхХцЦчЧщЩыьэЭюЮяЯ,. -";

VAR
 Form2: TForm2;
 Stream,Stream1: TFileStream;
 str, new: String;
 Buf: array [1..400] of char;
 num, Dlina_str, Dlina_new: Byte;

implementation

{$R *.dfm}

{Шифрование исходного текста}
procedure TForm2.Button1Click(Sender: TObject);
var c,i,num,k,l,m,n: integer;
begin
{Открытие файла}
try
 Stream:=TFileStream.Create("d:\input.txt", fmOpenRead);
 Stream.Seek(0,soFromEnd);
 count:=Stream.Size;
 Stream.Seek(0,soFromBeginning);
 Stream.Read(Buf,count);
 finally
 Stream.Free;
end;
New:="";
Str:="";
{Преобразование считанного текста в строку}
for i:=1 to count do
 Str:=Str+buf[i];
{Разбиение строки на пары символов}
Dlina_str:= Length(str) div 2;
FOR num:= 1 TO dlina_str DO
 New:= (New + Str[2*num-1] + Str[2*num]);
 {Шифрование открытого текста по матрице алфавита Плэйфера}
 str:="";
 Dlina_new:= Length(New)div 2;
 FOR num:= 1 TO Dlina_new DO
   begin
     p1:=pos(New[2*num-1],code);
     p2:=pos(New[2*num],code);
     k:=(p1 div 8)+1;
     l:=(p1 mod 8);
     if l=0 then begin k:=k-1; l:=8; end;
     m:=(p2 div 8)+1;
     n:=p2 mod 8;
     if n=0 then begin m:=m-1; n:=8; end;
     if k=m then  {Если символы находятся в одной строке матрицы алфавита}
     begin
       if l=8 then Str:=Str+matr[k,1] else Str:=Str+matr[k,l+1];
       if n=8 then str:=Str+matr[m,1] else Str:=Str+matr[m,n+1];
     end
     else
     if l=n then {Если в одном столбце}
     begin
       if k=8 then Str:=Str+matr[1,l] else Str:=Str+matr[k+1,l];
       if m=8 then Str:=Str+matr[1,n] else Str:=Str+matr[m+1,n];
     end
     else begin
           Str:=Str+matr[k,n];
           Str:=Str+matr[m,l];
           end;
   end;
 c:=Length(New);
 New:="";
 {Вывод полученного текста на экран}
   for i:=1 to c do
   begin
     Buf[i]:=Str[i]; New:=New+Str[i];
   end;
 Memo1.Lines.Add("");
 Memo1.Lines.Add("*************** Зашифрованный текст ***************");
 Memo1.Lines.Add(New);
 c:=Length(New);
 {Запись полученного текста в файл}
   try
   Stream1:=TFileStream.Create("d:\output.txt", fmOpenWrite);
   Stream1.Seek(0,soFromBeginning);
   Stream1.Write(Buf,c);
   finally
 Stream1.Free;
 end;
end;

{Дешифрование полученного текста}
procedure TForm2.Button2Click(Sender: TObject);
var i, count: integer;
begin
 try
 Stream:=TFileStream.Create("d:\input.txt", fmOpenRead);
 Stream.Seek(0,soFromEnd);
 count:=Stream.Size;
 Stream.Seek(0,soFromBeginning);
 Stream.Read(Buf,count);
 finally
 Stream.Free;
end;
New:= "";
Str:="";
for i:=1 to count do New:=New+buf[i];
Dlina_str:= Length(New)div 2;
FOR num:= 1 TO Dlina_str DO
 begin
     p1:=pos(New[2*num-1],code);
     p2:=pos(New[2*num],code);
     k:=(p1 div 8)+1;
     l:=(p1 mod 8);
     if l=0 then begin k:=k-1; l:=8; end;
     m:=(p2 div 8)+1;
     n:=p2 mod 8;
     if n=0 then begin m:=m-1; n:=8; end;
     if k=m then
     begin
       if l=1 then Str:=Str+shifr[k,8] else Str:=Str+shifr[k,l-1];
       if n=1 then Str:=Str+shifr[m,8] else Str:=Str+shifr[m,n-1];
     end
     else
     if l=n then
     begin
       if k=1 then Str:=Str+shifr[8,l] else Str:=Str+shifr[k-1,l];
       if m=1 then Str:=Str+shifr[8,n] else Str:=Str+shifr[m-1,n];
     end
     else begin
           Str:=Str+shifr[k,n];
           Str:=Str+shifr[m,l];
           end;
 end;
count:=Length(New);
New:="";
for i:=1 to count do
 begin
     Buf[i]:="0";
     Buf[i]:=Str[i];
   end;
 For i:=(count+1) to 400 do
 Buf[i]:=" ";
 Memo1.Lines.Add("");
 Memo1.Lines.Add("");
 Memo1.Lines.Add("*************** Расшифрованный текст ***************");
 Memo1.Lines.Add(Buf);
 try
   Stream1:=TFileStream.Create("d:\output.txt", fmOpenWrite);
   Stream1.Seek(0,soFromBeginning);
   Stream1.Write(Buf,count);
 finally
 Stream1.Free;
end;
end;

{Открытие исходного файла}
procedure TForm2.Button3Click(Sender: TObject);
begin
 try
 Stream:=TFileStream.Create("d:\input.txt", fmOpenRead);
 Stream.Seek(0,soFromEnd);
 count:=Stream.Size;
 Stream.Seek(0,soFromBeginning);
 Stream.Read(Buf,count);
 Memo1.Lines.Clear;
 Memo1.Lines.Add("*************** Исходный текст ***************");
 Memo1.Lines.Add(Buf);
 finally
 Stream.Free;
end;
end;
Мне нужно добавить в эту программу объекты (собственные, не стандартные), чтобы были реализованы все три принципа объектно-ориентированного программирования (использование property тоже требуется). Помогите, пожалуйста, это сделать, а то у самого не очень получается. Заранее спасибо!


 
Гаврила ©   (2006-05-12 23:09) [1]

Задание по учебе чтоли?
По сабжу.
Смотри сам. Что такое объект
это совокупность данных и методов по работе с этими данными.
Попробуй выделить некие сущности этого алгоритма в отдельные сушности, и сделай эти сущности объектами.
PS
Разбираться в том коде что ты написал...
архисложная задача. Не осилил


 
Джо ©   (2006-05-13 03:12) [2]

Реализуй наследников TStream. Первый, когда в него записываешь, "на лету" шифрует данные. Второй, когда из него читаешь, их расшифровывает. Дешево и практЫчно :)



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.034 c
15-1144426678
Sergey Masloff
2006-04-07 20:17
2006.05.28
Оффтоп. А вы говорите любэ. А я вот Ten Years After (p) 69 "Ssssh


2-1147267890
49 Cent
2006-05-10 17:31
2006.05.28
Не удается найти строку для обновления.


3-1144132931
Дмитрий_А
2006-04-04 10:42
2006.05.28
Правильно положить большой файл в БД


2-1147185339
HBZ
2006-05-09 18:35
2006.05.28
Использование DLL


2-1147268585
Андик
2006-05-10 17:43
2006.05.28
Вопрос по