Здравствуйте, посмотрела старые темы, нашла алгоритм
http://programmersforum.ru/showthread.php?t=16468
Но мне нужно проводить все махинации с входным и выходным файлом.
И еще, не учитывать пробел (чтобы можно было зашифровать текст и все слова были разделены пробелами)
Есть код, но он, как оно понятно не очень рабочий.
Прошу помочь.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, Math;
type
TForm1 = class(TForm)
gbInputFile: TGroupBox;
gbKey: TGroupBox;
gbOutputFile: TGroupBox;
gbControlPanel: TGroupBox;
edtInputFile: TEdit;
btnInputFile: TButton;
edtOutputFile: TEdit;
btnOutputFile: TButton;
btnStart: TButton;
btnQuit: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
lblInputFile: TLabel;
edtKey: TEdit;
lblKey: TLabel;
lblOutputFile: TLabel;
UpDown1: TUpDown;
GroupBox1: TGroupBox;
EdtKey1: TEdit;
UpDown2: TUpDown;
Label1: TLabel;
procedure btnInputFileClick(Sender: TObject);
procedure btnOutputFileClick(Sender: TObject);
procedure btnQuitClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{Функция определения наибольшего общего делителя}
function nod( a, b: longint): longint;
begin
while (a <> 0) and (b <> 0) do
if a >= b then
a:= a mod b //остаток от деления "а" на "б"
else
b:= b mod a; //остаток от деления "б" на "а"
nod:= a + b;
end;
procedure TForm1.btnInputFileClick(Sender: TObject);
begin
If OpenDialog1.Execute Then edtInputFile.Text := OpenDialog1.FileName;
end;
procedure TForm1.btnOutputFileClick(Sender: TObject);
begin
If SaveDialog1.Execute Then edtOutputFile.Text := SaveDialog1.FileName;
end;
procedure TForm1.btnQuitClick(Sender: TObject);
var s, s1, s2:String;
m, k:integer;
inFile, outFile : File Of Char;
a,b : Byte;
Symbol : Char;
begin
s := 'qwertyuiopasdfghjkl;zxcvbnm,.лпдралвфжлпавыолфоал0123456789';
a := 3;
b := 5;
m := 256; // a & m взаимно простые
AssignFile(inFile, edtInputFile.Text);
AssignFile(outFile, edtOutputFile.Text);
// Связываем дескрипторы с файлами
// обратно
While Not(EOF(inFile)) Do
Begin
Read(inFile, Symbol);
k := ord(Symbol);
while (k - b) mod a > 0 do k := k+m;
Symbol := chr((k - b) div a);
Write(outFile, Symbol);
end;
end;
procedure TForm1.btnStartClick(Sender: TObject);
var s, s1:String;
m, i, k:integer;
inFile, outFile : File Of Char;
a,b : Byte;
Symbol : Char;
j : integer;
begin
s := 'qwertyuiopasdfghjkl;zxcvbnm,.лпдралвфжлпавыолфоал0123456789';
m := 256; // a & m взаимно простые
AssignFile(inFile, edtInputFile.Text);
AssignFile(outFile, edtOutputFile.Text);
// Связываем дескрипторы с файлами
Try
a:= StrToInt(edtKey.Text);
b:= StrToInt(edtKey1.Text);
Reset(inFile);
Rewrite(outFile);
Except
Application.MessageBox('Не удалось обработать входные параметры. Проверьте правильность введенных значений и повторите попытку','Ошибка!');
Exit;
End;
// шифрование s --> s1
s1 := s;
While Not(EOF(inFile)) Do
Begin
Read(inFile, Symbol);
Symbol := chr( (ord(Symbol)*a+b) mod m);
Write(outFile, Symbol);
end;
end;
end.
Заранее спасибо!