Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.05.2014, 04:00
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
Восклицание Windows завершает работу программы

Здравствуйте, программу переписал уже раз 10. менял всё с нуля. каждый раз ошибка. вкратце: прога создает или загружает ключ, потом цепляет файл и шифрует его, записывая в "crypted.dat". но после успешной компиляции, после того как выбираю файл и нажимаю СТАРТ (шифрование), windows завершает работу программы. подскажите кто может.

Код:
unit Unit1;

interface

uses
  math,Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    Label2: TLabel;
    Button2: TButton;
    Edit2: TEdit;
    Button3: TButton;
    Label3: TLabel;
    Edit3: TEdit;
    Button4: TButton;
    OpenDialog2: TOpenDialog;
    Edit4: TEdit;
    Button5: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  cryptkey:file of byte;
  key,keygen:array[0..9] of byte;
  OpenF,CloseF:TFileStream;
  f2:textfile;
  keyround:array[0..31] of int64;
  x16,x161:byte; toEdit2:string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
filekey:tfilestream;
i:byte;
begin   randomize;
filekey:=Tfilestream.Create('key.txt',fmCreate);
filekey.Position:=0;
Edit2.Text:='';
for i:=0 to 9 do
    begin
    key[i]:=random(255);
    filekey.Write(key[i],sizeof(key[i]));
    //отображение ключа в 16-ричной системе ->
    x16:=key[i] div 16;
    x161:=key[i] mod 16;
    if (x16 < 10) then toEdit2:=inttostr(x16)
    else case x16 of
         10: toedit2:='A';
         11: toedit2:='B';
         12: toedit2:='C';
         13: toedit2:='D';
         14: toedit2:='E';
         15: toedit2:='F';
         end;
    if (x161 < 10) then toEdit2:=toedit2 + inttostr(x161)
    else case x161 of
         10: toedit2:=toedit2 + 'A';
         11: toedit2:=toedit2 + 'B';
         12: toedit2:=toedit2 + 'C';
         13: toedit2:=toedit2 + 'D';
         14: toedit2:=toedit2 + 'E';
         15: toedit2:=toedit2 + 'F';
         end;
    Edit2.Text:=Edit2.Text + '$' + toedit2 + ' ';

    end;   // <- отображение ключа в 16-ричной системе

filekey.Free;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute=true then
   Edit1.Text:=OpenDialog1.FileName;
   OpenDialog1.FreeOnRelease;
end;

procedure TForm1.Button3Click(Sender: TObject);

var
help:int64;
fin,fout: array[0..10000000] of int64;
s,s1,bs,bs1,nom,buf8,razmerhvosta:byte;
keyi:file of byte;
massiv:string; round:byte;
razmer,num,change,i1,sxor:int64;
sizefile,ifile:longint;
const sbox:array [0..15] of byte=(5,14,15,8,12,1,2,13,11,4,6,3,0,7,9,10);
pbox:array [0..63] of byte = (0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,1,
                              5,9,13,17,21,25,29,33,37,41,45,49,53,57,
                              61,2,6,10,14,18,22,26,30,34,38,42,46,5,54,58,
                              62,3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63);
begin

  for round:=0 to 31 do
    begin  //Генерация раундовых подлкючей

        for s1:=0 to 7 do
        begin
        help:=key[s1];
        help:=help shl 8*(7-s1);
        keyround[round]:=keyround[round]+help;

        end;

     keygen[0]:=key[7] shl 5;
     keygen[0]:=keygen[0]+(key[8] shr 3);
     keygen[1]:=key[8] shl 5;
     keygen[1]:=keygen[1]+(key[9] shr 3);
     keygen[2]:=key[9] shl 5;
     keygen[2]:=keygen[2]+(key[0] shr 3);
     keygen[3]:=key[0] shl 5;
     keygen[3]:=keygen[3]+(key[1] shr 3);
     keygen[4]:=key[1] shl 5;
     keygen[4]:=keygen[4]+(key[2] shr 3);
     keygen[5]:=key[2] shl 5;
     keygen[5]:=keygen[5]+(key[3] shr 3);
     keygen[6]:=key[3] shl 5;
     keygen[6]:=keygen[6]+(key[4] shr 3);
     keygen[7]:=key[4] shl 5;
     keygen[7]:=keygen[7]+(key[5] shr 3);
     keygen[8]:=key[5] shl 5;
     keygen[8]:=keygen[8]+(key[6] shr 3);
     keygen[9]:=key[6] shl 5;
     keygen[9]:=+keygen[9]+(key[7] shr 3);

      for s1:=0 to 9 do key[s1]:=keygen[s1];




     buf8:=key[0] shr 4;
     buf8:=buf8 shl 4;

     key[0]:=(key[0] shl 4) shr 4;
     key[0]:=key[0] + buf8;

     buf8:=round shr 1;

     key[7]:=key[7] xor buf8;

     buf8:=round shl 7;

     key[8]:=key[8] xor buf8;
     buf8:=0;

    end; // Генерация раундовых подключей

  //Загрузка файла

  OpenF:=TFileStream.Create(Edit1.Text,fmOpenRead);
  OpenF.Position:=0;

  razmer:=OpenF.Size;
  change:= razmer div 8;

  s1:=0;
  for round:=0 to change do
      begin
      i1:=0;
      for s1:=round to 7 do
                     begin
                     i1:=OpenF.Read(i1,1);
                     i1:=i1 shl (8*(7-s1));
                     fin[round]:=fin[round]+i1;
                     end;
      end;
      razmerhvosta:=razmer-(change*8);
      if (razmerhvosta<>0) then
                   begin
                     round:=round+1;
                     for s1:=0 to razmerhvosta do
                            begin
                     i1:=OpenF.Read(i1,1);
                     i1:=i1 shl (8*(7-s1));
                     fin[round]:=fin[round]+i1;
                     end;
                   end;

  //Загрузка файла

  for ifile:=0 to round do    //Шифрование
      begin //SP-сеть
      fout[ifile]:=0; change:=0;
      for s1:=0 to 30 do
        begin
        fin[ifile]:=fin[ifile] xor keyround[ifile];

          for s:=0 to 15 do    //S-замена
                    begin
                    change:=fin[ifile] shl (s*4);
                    change:=change shr 60;
                    buf8:=change;
                    buf8:=sbox[buf8];
                    change:=buf8;
                    change:=change shl (60-(s*4));

                    change:=change+((fin[ifile] shr (64-(s*4))) shl (64-(s*4)));
                    change:=change+((fin[ifile] shl (4+(s*4))) shr (4+(s*4)));

                    end;
                               //S-замена

        for s:=0 to 63 do        //P-перестановка
            begin
            change:=fin[ifile] shr (63-s);
            change:=change shl 63;
            change:=change shr pbox[s];
            fout[ifile]:=fout[ifile]+change;

            end;                 //P-перестановка

        end; //SP-сеть

        fout[num]:=fout[num] xor keyround[31];
                      //необходимо выходной блок проксорить с 31 подключом!!!
      end;          //Шифрование

CloseF:=Tfilestream.Create('crypted.dat',fmCreate);

for ifile:=0 to round do CloseF.Write('crypted.dat',fout[ifile]);

OpenF.Free; CloseF.Free;


end;




procedure TForm1.Button4Click(Sender: TObject);

var
ikey,bufkey:byte;

begin

if OpenDialog2.Execute then
Edit3.Text:=OpenDialog2.FileName;
OpenDialog2.FreeOnRelease;

AssignFile(f2,Edit3.Text);
Reset(f2);
ikey:=0;

while not eof(f2) do
begin
 Read(f2,bufkey);
 key[ikey]:=bufkey;
 ikey:=ikey + 1;

 end;

 end;


procedure TForm1.Button5Click(Sender: TObject);
var
s23:integer;
begin
for s23 := 0 to 9 do
begin
Edit4.Text:=edit4.Text + ' ';

    x16:=key[s23] div 16;
    x161:=key[s23] mod 16;
    if (x16 < 10) then toEdit2:=inttostr(x16)
    else case x16 of
         10: toedit2:='A';
         11: toedit2:='B';
         12: toedit2:='C';
         13: toedit2:='D';
         14: toedit2:='E';
         15: toedit2:='F';
         end;
    if (x161 < 10) then toEdit2:=toedit2 + inttostr(x161)
    else case x161 of
         10: toedit2:=toedit2 + 'A';
         11: toedit2:=toedit2 + 'B';
         12: toedit2:=toedit2 + 'C';
         13: toedit2:=toedit2 + 'D';
         14: toedit2:=toedit2 + 'E';
         15: toedit2:=toedit2 + 'F';
         end;
    Edit4.Text:=Edit4.Text + '$' + toedit2 + ' ';

end;
Edit4.Visible:=true;
end;

end.
Ответить с цитированием
  #2  
Старый 27.05.2014, 04:09
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Если поможет
Изображения
Тип файла: jpg Снимок.JPG (83.2 Кбайт, 15 просмотров)
Ответить с цитированием
  #3  
Старый 27.05.2014, 07:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Во-первых, есть такая встроенная функция IntToHex.
Во-вторых. Обычно винда "срубает" программу когда происходит попытка записи в защищенную область памяти. Скорее всего это результат того, что у тебя какой-либо указатель не инициализируется или происходит выход за пределы массива, что не проверяется.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
vankai14 (27.05.2014)
  #4  
Старый 27.05.2014, 12:22
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

скорее всего вот это располагается в стеке
fin,fout: array[0..10000000] of int64;
вытащите в глобалы
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
vankai14 (27.05.2014)
  #5  
Старый 27.05.2014, 14:03
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
скорее всего вот это располагается в стеке
fin,fout: array[0..10000000] of int64;
вытащите в глобалы

Спасибо! не вылетает))) только теперь проблема другая... зашифрованный файл получается размером 100 Мегабайт из исходного 1 килобайт((
Ответить с цитированием
  #6  
Старый 27.05.2014, 14:49
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А что и сколько Вы пишете здесь ?
Код:
CloseF.Write('crypted.dat',fout[ifile]);
Ответить с цитированием
  #7  
Старый 27.05.2014, 15:36
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
А что и сколько Вы пишете здесь ?
Код:
CloseF.Write('crypted.dat',fout[ifile]);

После чтения файла в массив fin[x..x] типа int64, в цикле от нуля до количества считанных из файла блоков к каждому fin[N] применяется ряд преобразований. ксорится с ключом keyround[N], потом замены и перестановки. и вот как раз результат всех этих преобразований пишется в массив FOUT[N]. Есть чуйка, что я как-то неправильно записываю выходной массив в файл 'crypted'. В результате по идее должен получиться файл непонятный. такой, что если исходный был *.txt, то если открыть его через блокнот, там непонятный символы. ИЛИ если исходный - *.jpg, то выходной открывая через imageviewer какой-нибудь, тоже непонятная картинка появится. Потом в результате расшифровки по тому же алгоритму, но с ключами в обратном порядке из FOUT получается FIN, полностью соответствующий исходному файлу. Расшифровку я дописал, но опять же получаются бредовые выходгные данные. может подскажите если я как-то неправильно файлы загружаю и выгружаю?
Ответить с цитированием
  #8  
Старый 27.05.2014, 16:18
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Я имел ввиду, посмотреть в справке параметры функции TStream.Write, и сравнить с теми, что Вы туда подаёте
Ответить с цитированием
  #9  
Старый 27.05.2014, 17:21
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Я имел ввиду, посмотреть в справке параметры функции TStream.Write, и сравнить с теми, что Вы туда подаёте

А так не правильней будет как считаете? разбивать и писать по 1 байту

Код:
var helpwrite64:int64; helpwrite8:byte;
.........................
CloseF:=Tfilestream.Create('crypted',fmCreate);
     for ifile:=0 to round do for s:=0 to 7 do
                              begin
                              helpwrite64:=((fout[ifile] shl (s*8)) shr 56 );
                              helpwrite8:=helpwrite64;
                              CloseF.Write('crypted',helpwrite8,1);
                              end;
     CloseF.Free;

Последний раз редактировалось vankai14, 27.05.2014 в 17:23.
Ответить с цитированием
  #10  
Старый 27.05.2014, 17:43
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Уточняю - у write - два параметра.Первый - это что пишем, второй сколько.
Что там делает 'crypted'?
А правильней, наверно можно так
Код:
for ifile:=0 to round do CloseF.Write(fout[ifile],sizeof(fout[ifile]));
или даже так
Код:
CloseF.Write(fout[0],sizeof(fout[0])*ifile);
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
vankai14 (27.05.2014)
  #11  
Старый 27.05.2014, 17:46
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Уточняю - у write - два параметра.Первый - это что пишем, второй сколько.
Что там делает 'crypted'?
А правильней, наверно можно так
Код:
for ifile:=0 to round do CloseF.Write(fout[ifile],sizeof(fout[ifile]));
или даже так
Код:
CloseF.Write(fout[0],sizeof(fout[0])*ifile);


Точно! Спасибо)) по привычке написал как в ассигнфайл.
Ответить с цитированием
  #12  
Старый 27.05.2014, 17:48
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Уточняю - у write - два параметра.Первый - это что пишем, второй сколько.
Что там делает 'crypted'?
А правильней, наверно можно так
Код:
for ifile:=0 to round do CloseF.Write(fout[ifile],sizeof(fout[ifile]));
или даже так
Код:
CloseF.Write(fout[0],sizeof(fout[0])*ifile);

вот только, в таком варианте

Код:
CloseF.Write(fout[0],sizeof(fout[0])*ifile);

он же будет записыывать sizeof(fout[0])*ifile раз, не так ли?

или это позиция?
Ответить с цитированием
  #13  
Старый 27.05.2014, 18:17
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Уточняю - у write - два параметра.Первый - это что пишем, второй сколько.
Что там делает 'crypted'?
А правильней, наверно можно так
Код:
for ifile:=0 to round do CloseF.Write(fout[ifile],sizeof(fout[ifile]));
или даже так
Код:
CloseF.Write(fout[0],sizeof(fout[0])*ifile);


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

Код:
unit Unit1;

interface

uses
  math,Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    Label2: TLabel;
    Button2: TButton;
    Edit2: TEdit;
    Button3: TButton;
    Label3: TLabel;
    Edit3: TEdit;
    Button4: TButton;
    OpenDialog2: TOpenDialog;
    Edit4: TEdit;
    Button5: TButton;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Label4: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  cryptkey:file of byte;
  key,keygen:array[0..9] of byte;
  OpenF,CloseF:TFileStream; trydec:file;
  f2:textfile;
  keyround,keydcr:array[0..31] of int64;
  x16,x161:byte; toEdit2:string;
  fin,fout: array[0..10000000] of int64;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
filekey:tfilestream;
i:byte;
begin   randomize;
filekey:=Tfilestream.Create('key.txt',fmCreate);
filekey.Position:=0;
Edit2.Text:='';
for i:=0 to 9 do
    begin
    key[i]:=random(255);
    filekey.Write(key[i],sizeof(key[i]));
    //отображение ключа в 16-ричной системе ->
    x16:=key[i] div 16;
    x161:=key[i] mod 16;
    if (x16 < 10) then toEdit2:=inttostr(x16)
    else case x16 of
         10: toedit2:='A';
         11: toedit2:='B';
         12: toedit2:='C';
         13: toedit2:='D';
         14: toedit2:='E';
         15: toedit2:='F';
         end;
    if (x161 < 10) then toEdit2:=toedit2 + inttostr(x161)
    else case x161 of
         10: toedit2:=toedit2 + 'A';
         11: toedit2:=toedit2 + 'B';
         12: toedit2:=toedit2 + 'C';
         13: toedit2:=toedit2 + 'D';
         14: toedit2:=toedit2 + 'E';
         15: toedit2:=toedit2 + 'F';
         end;
    Edit2.Text:=Edit2.Text + '$' + toedit2 + ' ';

    end;   // <- отображение ключа в 16-ричной системе

filekey.Free;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute=true then
   Edit1.Text:=OpenDialog1.FileName;
   OpenDialog1.FreeOnRelease;
end;

procedure TForm1.Button3Click(Sender: TObject);

var
help:int64;

s,s1,bs,bs1,nom,buf8,razmerhvosta:byte;
keyi:file of byte;
massiv:string; round,helpwrite8:byte;
razmer,num,change,i1,sxor,helpwrite64:int64;
sizefile,ifile:longint;
const sbox:array [0..15] of byte=(5,14,15,8,12,1,2,13,11,4,6,3,0,7,9,10);
pbox:array [0..63] of byte = (0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,1,
                              5,9,13,17,21,25,29,33,37,41,45,49,53,57,
                              61,2,6,10,14,18,22,26,30,34,38,42,46,5,54,58,
                              62,3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63);
begin

  for round:=0 to 31 do
    begin  //Генерация раундовых подлкючей

        for s1:=0 to 7 do
        begin
        help:=key[s1];
        help:=help shl 8*(7-s1);
        keyround[round]:=keyround[round]+help;

        end;

     keygen[0]:=key[7] shl 5;
     keygen[0]:=keygen[0]+(key[8] shr 3);
     keygen[1]:=key[8] shl 5;
     keygen[1]:=keygen[1]+(key[9] shr 3);
     keygen[2]:=key[9] shl 5;
     keygen[2]:=keygen[2]+(key[0] shr 3);
     keygen[3]:=key[0] shl 5;
     keygen[3]:=keygen[3]+(key[1] shr 3);
     keygen[4]:=key[1] shl 5;
     keygen[4]:=keygen[4]+(key[2] shr 3);
     keygen[5]:=key[2] shl 5;
     keygen[5]:=keygen[5]+(key[3] shr 3);
     keygen[6]:=key[3] shl 5;
     keygen[6]:=keygen[6]+(key[4] shr 3);
     keygen[7]:=key[4] shl 5;
     keygen[7]:=keygen[7]+(key[5] shr 3);
     keygen[8]:=key[5] shl 5;
     keygen[8]:=keygen[8]+(key[6] shr 3);
     keygen[9]:=key[6] shl 5;
     keygen[9]:=+keygen[9]+(key[7] shr 3);

      for s1:=0 to 9 do key[s1]:=keygen[s1];




     buf8:=key[0] shr 4;
     buf8:=buf8 shl 4;

     key[0]:=(key[0] shl 4) shr 4;
     key[0]:=key[0] + buf8;

     buf8:=round shr 1;

     key[7]:=key[7] xor buf8;

     buf8:=round shl 7;

     key[8]:=key[8] xor buf8;
     buf8:=0;

    end; // Генерация раундовых подключей


  if radiobutton2.Checked=TRUE then    // Ключи в обратном порядке для расшифровки
     begin
     for round:=0 to 31 do keydcr[round]:=keyround[31-round];
     for round:=0 to 31 do keyround[round]:=keydcr[round];

     end;                     // Ключи в обратном порядке для расшифровки


  //Загрузка файла

  OpenF:=TFileStream.Create(Edit1.Text,fmOpenRead);
  OpenF.Position:=0;

  razmer:=OpenF.Size;
  change:= razmer div 8;

  s1:=0;
  for round:=0 to change do
      begin
      i1:=0;
      for s1:=round to 7 do
                     begin
                     i1:=OpenF.Read(i1,1);
                     i1:=i1 shl (8*(7-s1));
                     fin[round]:=fin[round]+i1;
                     end;
      end;
      razmerhvosta:=razmer-(change*8);
      if (razmerhvosta<>0) then
                   begin
                     round:=round+1;
                     for s1:=0 to razmerhvosta do
                            begin
                     i1:=OpenF.Read(i1,1);
                     i1:=i1 shl (8*(7-s1));
                     fin[round]:=fin[round]+i1;
                     end;
                   end;

  //Загрузка файла

  for ifile:=0 to round do    //Шифрование
      begin //SP-сеть
      fout[ifile]:=0; change:=0;
      for s1:=0 to 30 do
        begin
        fin[ifile]:=fin[ifile] xor keyround[ifile];

          for s:=0 to 15 do    //S-замена
                    begin
                    change:=fin[ifile] shl (s*4);
                    change:=change shr 60;
                    buf8:=change;
                    buf8:=sbox[buf8];
                    change:=buf8;
                    change:=change shl (60-(s*4));

                    change:=change+((fin[ifile] shr (64-(s*4))) shl (64-(s*4)));
                    change:=change+((fin[ifile] shl (4+(s*4))) shr (4+(s*4)));

                    end;
                               //S-замена

        for s:=0 to 63 do        //P-перестановка
            begin
            change:=fin[ifile] shr (63-s);
            change:=change shl 63;
            change:=change shr pbox[s];
            fout[ifile]:=fout[ifile]+change;

            end;                 //P-перестановка

        end; //SP-сеть

        fout[num]:=fout[num] xor keyround[31];
                      //необходимо выходной блок проксорить с 31 подключом!!!
      end;          //Шифрование


     if radiobutton1.Checked=TRUE then
     begin
     CloseF:=Tfilestream.Create('crypted',fmCreate);
     for ifile:=0 to round do for s:=0 to 7 do
                              begin
                              helpwrite64:=((fout[ifile] shl (s*8)) shr 56 );
                              helpwrite8:=helpwrite64;
                              CloseF.Write(helpwrite8,sizeof(helpwrite8));
                              end;
     CloseF.Free;
     end;


     //Пробуем записать через ассигн
     AssignFile(trydec,'decrypted1');
     rewrite(trydec);
     if radiobutton2.Checked=TRUE then
       begin
        for ifile:=0 to round do for s:=0 to 7 do
                                 begin
                                 helpwrite64:=((fout[ifile] shl (s*8)) shr 56 );
                                 helpwrite8:=helpwrite64;
                                 BlockWrite(trydec, helpwrite8,sizeof(helpwrite8));
                                 end;

       end;
     CloseFile(trydec);
     //Пробуем записать через ассигн

OpenF.Free;


end;

procedure TForm1.Button4Click(Sender: TObject);

var
ikey,bufkey:byte;

begin

if OpenDialog2.Execute then
Edit3.Text:=OpenDialog2.FileName;
OpenDialog2.FreeOnRelease;

AssignFile(f2,Edit3.Text);
Reset(f2);
ikey:=0;

while not eof(f2) do
begin
 Read(f2,bufkey);
 key[ikey]:=bufkey;
 ikey:=ikey + 1;

 end;

 end;


procedure TForm1.Button5Click(Sender: TObject);
var
s23:integer;
begin
for s23 := 0 to 9 do
begin
Edit4.Text:=edit4.Text + ' ';

    x16:=key[s23] div 16;
    x161:=key[s23] mod 16;
    if (x16 < 10) then toEdit2:=inttostr(x16)
    else case x16 of
         10: toedit2:='A';
         11: toedit2:='B';
         12: toedit2:='C';
         13: toedit2:='D';
         14: toedit2:='E';
         15: toedit2:='F';
         end;
    if (x161 < 10) then toEdit2:=toedit2 + inttostr(x161)
    else case x161 of
         10: toedit2:=toedit2 + 'A';
         11: toedit2:=toedit2 + 'B';
         12: toedit2:=toedit2 + 'C';
         13: toedit2:=toedit2 + 'D';
         14: toedit2:=toedit2 + 'E';
         15: toedit2:=toedit2 + 'F';
         end;
    Edit4.Text:=Edit4.Text + '$' + toedit2 + ' ';

end;
Edit4.Visible:=true;
end;

end.


Теперь при открытии вылетает ошибка "Access to violation to adress"
Ответить с цитированием
  #14  
Старый 28.05.2014, 01:31
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vankai14
переписал немного. теперь выходной файл загружаю через ассигн. так как когда через файлстрим делаю, в выходном бред, который не сходится с оригиналом
Глупости. AssignFile я уже и забыл когда использовал. С файлами работаю практически всегда через TFileStream - никакого бреда никогда не замечал - что записывал, то и записывалось.
Цитата:
Сообщение от vankai14
Теперь при открытии вылетает ошибка "Access to violation to adress"
В сообщение об ошибке Access Violation указывается так же и адрес инструкции в программе, которая вызвала это нарушение доступа к памяти, поэтому в первую очередь нужно смотреть что находится по указанному адресу (меню -> Search -> Find Error)
Ответить с цитированием
  #15  
Старый 28.05.2014, 12:29
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Кстати, если описываешь
Код:
trydec:file;
то открывать надо так
Код:
rewrite(trydec,1);
потомучто по умолчанию размер блока равен 128.
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
alyan (29.05.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:22.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter