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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2014, 22:51
alyan alyan вне форума
Прохожий
 
Регистрация: 22.05.2014
Сообщения: 8
Версия Delphi: Delphi XE5
Репутация: 10
Восклицание Вылетает при загрузке файла

СРОЧНО!!! ЗАВТРА ДИПЛОМ НА ПРОВЕРКУ НЕСТИ!!! ПРОГРАММА ВЫЛЕТАЕТ ПРИ ПОПЫТКЕ ЧТЕНИЯ ФАЙЛА И ЗАПИСИ ДРУГОГО. В ОБЩЕМ ПРОГА ДОЛЖНА ЧИТАТЬ ФАЙЛ И ШИФРОВАТЬ В СООТВЕТСТВИИ С АЛГОРИТМОМ И С ПОМОЩЬЮ КЛЮЧЕЙ. ВЫБРАННЫЙ ФАЙЛ. ВОТ КОД КНОПКИ, КОТОРАЯ ВСЁ ЭТО ЗАПУСКАЕТ:

Код:
procedure TForm1.Button5Click(Sender: TObject);
var nom:byte; razmer,change,sxor:int64;
keyround:array[0..31] of int64;
b8in,b8out:array[0..7,0..1000000] of byte;
razmerhvosta:byte;
bs,bs1,s1:byte;
sizefile8:int64;

const sbox:array [1..16] of byte=(5,14,15,8,12,1,2,13,11,4,6,3,0,7,9,10);
pbox:array [1..64] 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

//загрузка файлов

OpenFile:=TFileStream.Create(Edit4.Text,fmOpenRead);
OpenFile.Position:=0;

CloseFile:=TFileStream.Create('crypted.bin',fmCreate);
CloseFile.Position:=0;

sizefile8:=OpenFile.Size;
sizefile8:=sizefile8 div 8;

//загрузка файлов


//загрузка файла в двумерный массив

for i:=0 to sizefile8 do
    for i1:=0 to 7 do OpenFile.Read(b8in[i,i1],1);

razmerhvosta:=OpenFile.Size - sizefile8*8;

if (razmerhvosta > 0) then
   for i2:=i1 to razmerhvosta do OpenFile.Read(b8in[i+1,i2],1);

if (razmerhvosta < 7) then
    for  i2:=i2 to 7 do OpenFile.Read(b8in[i+1,i2],1);




//загрузка файла в двумерный массив


for i:=0 to 31 do    //генерация клбючей
  begin

  begin //4

  for nom:=0 to 7 do
  begin
  change:=key[nom];
  change:=change shl (8*(7-nom));    //сдвиг битов ключа на Х  бит
  keyround[i]:=keyround[i] + change;
   end;

  change:=keyround[i1];
  razmer:=change shr 60;
  razmer:=sbox[change];
  razmer:=razmer shl 60;
  change:=razmer + ((change shl 4) shr 4 );

  razmer:=(change shl  44) shr 59;
  razmer:= razmer xor i;
  razmer:=razmer shl 15;

  change:=((change shr 20) shl 20) + ((change shl 49) shl 49) + razmer;

  keyround[i]:=change;

  end;   //4

  end;  //генерация ключей

  //i - цмкл сети SP,




  for i4:=0 to (sizefile8 + 1) do

  for i:=0 to 30 do       //сеть SP
    begin

    //Key XOR->  заполняем sxor:int64 байтами входного, ксорим и пишем назад

       for i1:=0 to 7 do  sxor:=sxor + (b8in[i4,i1]) shl (7 - i1);

       sxor:=sxor xor keyround[i];

       for i1:=0 to 7 do b8in[i4,i1]:=sxor shr (7-i1);
       //key xor


       //Sbox перестановка->

       i1:=0;
   for i2:=0 to 7 do
   begin
   i1:=i1+1;
   nom:=sbox[i1] div 2;
   if (sbox[i1] mod 2 = 0) then begin
                               bs:=b8in[i4,nom] shr 4;
                               bs:=bs shl 4;
                               end
                          else bs:=b8in[i4,nom] shl 4;

   i1:=i1+1;
   nom:=sbox[i1] div 2;
   if (sbox[i1] mod 2 = 0) then bs1:=b8in[i4,nom] shr 4
                          else begin
                               bs1:=b8in[i,nom] shl 4;
                               bs1:=bs1 shr 4;
                               end;
   b8out[i4,i2]:=bs+bs1;
   b8in[i4,i2]:=b8out[i,i2];

   end;

       //<- Sbox перестановка

   //-> Pbox перестановка
      bs1:=0;
      for s1:=0 to 63 do
        begin

        nom:=pbox[s1] div 8;
        bs:=b8out[i4,nom];
        bs:=bs shl (pbox[s1] mod 8);
        bs:=bs shr 7;
        bs:=bs shl (7 - pbox[s1]);

        bs1:=bs1+bs;
        b8out[i4,s1 div 8]:=b8out[i4,s1 div 8]+bs1;
        end;

       //<--Pbox перестановка


   end;                  //сеть SP



   for i:=0 to (sizefile8 + 1) do
    for i1:=0 to 7 do OpenFile.write(b8out[i,i1],1);

OpenFile.Free;
CloseFile.Free;


end;
Ответить с цитированием
  #2  
Старый 23.05.2014, 01:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Не надо все писать капсом. Это невежливо.
2. Не стоит использовать в качестве переменных зарезервированные имена функций работы с файлами, как то OpenFile, CloseFile
3. Запуск вашего кода с точками останова и последующей построчной отладкой, вам поможет намного быстрее.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 23.05.2014, 01:07
alyan alyan вне форума
Прохожий
 
Регистрация: 22.05.2014
Сообщения: 8
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
1. Не надо все писать капсом. Это невежливо.
2. Не стоит использовать в качестве переменных зарезервированные имена функций работы с файлами, как то OpenFile, CloseFile
3. Запуск вашего кода с точками останова и последующей построчной отладкой, вам поможет намного быстрее.


спасибо. про имена забыл совсем.Насчет третьего пункта, я не могу разобраться как в делфи это сделать. подскажите?
Ответить с цитированием
  #4  
Старый 23.05.2014, 01:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Можно вообще с самого начала построчно F7
2. В дельфи слева от текста программы есть область, там обычно номера строк. Кликните мышкой в нее и строка выделится красным цветом. Это будет точка останова программы. Теперь если вы запустите ваше приложение F9, то выполнение кода прервется на выделенной строке.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 23.05.2014, 02:10
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

И опять одни и те же грабли - глобальные переменные под счётчик, нужно переместить все i`шки что задействованы в циклах for..to..do в var-секцию этой процедуры
Ответить с цитированием
  #6  
Старый 23.05.2014, 02:56
alyan alyan вне форума
Прохожий
 
Регистрация: 22.05.2014
Сообщения: 8
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
И опять одни и те же грабли - глобальные переменные под счётчик, нужно переместить все i`шки что задействованы в циклах for..to..do в var-секцию этой процедуры


все переменные циклов сделал локальными, но при запуске программы winsows завершает работу приложения
Ответить с цитированием
  #7  
Старый 23.05.2014, 03:09
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Покажите пжлст массив key, его содержимое
Ответить с цитированием
  #8  
Старый 23.05.2014, 03:23
alyan alyan вне форума
Прохожий
 
Регистрация: 22.05.2014
Сообщения: 8
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Покажите пжлст массив key, его содержимое

как и просили

Код:
Ckey:=TFilestream.create('key.txt',fmCreate);
ckey.Position:=0;
Edit1.Text:='';




for i:=0 to 9 do
  begin
  key[i]:=random(255);
  Ckey.Write(key[i],sizeof(key[i])) ;
Ответить с цитированием
  #9  
Старый 23.05.2014, 03:33
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Нет слов, - собрал под вашу процедуру сборку, исправил что увидел, делфя лишь ругается на массив, что у вас обозначен как key[i], чтоб запустить нужен он и только он, его описание, а вы что показываете?

З.Ы. Догадался ужо, key: array[0..9] of byte;

Последний раз редактировалось Alegun, 23.05.2014 в 03:40.
Ответить с цитированием
  #10  
Старый 23.05.2014, 03:45
alyan alyan вне форума
Прохожий
 
Регистрация: 22.05.2014
Сообщения: 8
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Нет слов, - собрал под вашу процедуру сборку, исправил что увидел, делфя лишь ругается на массив, что у вас обозначен как key[i], чтоб запустить нужен он и только он, его описание, а вы что показываете?

переписал процедуру, изменил имена файлов, немного подправил генератор ключей. Вот:

Код:
procedure TForm1.Button5Click(Sender: TObject);
var nom:byte; razmer,change,sxor:int64;
keyround:array[0..31] of int64;
b8in,b8out:array[0..7,0..100000000] of byte;
razmerhvosta:byte;
bs,bs1,s1:byte;
sizefile8:int64;
ii,i1,i3,i4,i2:longint;
keychange:array[0..7] of byte;

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

//загрузка файлов

OpenFilee:=TFileStream.Create(Edit4.Text,fmOpenRead);
OpenFilee.Position:=0;

CloseFilee:=TFileStream.Create('crypted.bin',fmCreate);
CloseFilee.Position:=0;

sizefile8:=OpenFile.Size;
sizefile8:=sizefile8 div 8;

//загрузка файлов


//загрузка файла в двумерный массив

for ii:=0 to sizefile8 do
    for i1:=0 to 7 do OpenFilee.Read(b8in[ii,i1],1);

razmerhvosta:=OpenFilee.Size - sizefile8*8;

if (razmerhvosta > 0) then
   for i2:=i1 to razmerhvosta do OpenFilee.Read(b8in[ii+1,i2],1);

if (razmerhvosta < 7) then
    for  i2:=i2 to 7 do OpenFilee.Read(b8in[ii+1,i2],1);




//загрузка файла в двумерный массив


for ii:=0 to 31 do    //генерация клбючей
  begin

  begin //4

  for nom:=0 to 7 do
  begin
  change:=key[nom];
  change:=change shl (8*(7-nom));    //сдвиг битов ключа на Х  бит
  keyround[ii]:=keyround[ii] + change;
   end;

  change:=keyround[ii];
  razmer:=change shr 60;
  razmer:=sbox[razmer];
  razmer:=razmer shl 60;
  change:=razmer + ((change shl 4) shr 4 );

  razmer:=(change shl  44) shr 59;
  razmer:= razmer xor ii;
  razmer:=razmer shl 15;

  change:=((change shr 20) shl 20) + ((change shl 49) shr 49) + razmer;

  keyround[ii]:=change;

  end;   //4

  end;  //генерация ключей

  //i - цмкл сети SP,




  for i4:=0 to (sizefile8 + 1) do

  for ii:=0 to 30 do       //сеть фейстеля
    begin

    //Key XOR->  заполняем sxor:int64 байтами входного, ксорим и пишем назад

       for i1:=0 to 7 do  sxor:=sxor + (b8in[i4,i1]) shl (7 - i1);

       sxor:=sxor xor keyround[ii];

       for i1:=0 to 7 do b8in[i4,i1]:=sxor shr (7-i1);
       //key xor


       //Sbox перестановка->

       i1:=0;
   for i2:=0 to 7 do
   begin
   i1:=i1+1;
   nom:=sbox[i1] div 2;
   if (sbox[i1] mod 2 = 0) then begin
                               bs:=b8in[i4,nom] shr 4;
                               bs:=bs shl 4;
                               end
                          else bs:=b8in[i4,nom] shl 4;

   i1:=i1+1;
   nom:=sbox[i1] div 2;
   if (sbox[i1] mod 2 = 0) then bs1:=b8in[i4,nom] shr 4
                          else begin
                               bs1:=b8in[ii,nom] shl 4;
                               bs1:=bs1 shr 4;
                               end;
   b8out[i4,i2]:=bs+bs1;
   b8in[i4,i2]:=b8out[ii,i2];

   end;

       //<- Sbox перестановка

   //-> Pbox перестановка
      bs1:=0;
      for s1:=0 to 63 do
        begin

        nom:=pbox[s1] div 8;
        bs:=b8out[i4,nom];
        bs:=bs shl (pbox[s1] mod 8);
        bs:=bs shr 7;
        bs:=bs shl (7 - pbox[s1]);

        bs1:=bs1+bs;
        b8out[i4,s1 div 8]:=b8out[i4,s1 div 8]+bs1;
        end;

       //<--Pbox перестановка


   end;                  //сеть фейстеля

   for ii:=2 to 9 do keychange[ii]:=key[ii-2];
     keychange[0]:=key[8]; keychange[1]:=key[9];
     for ii:=0 to 9 do key[ii]:=keychange[ii];

   for ii:=0 to (sizefile8 + 1) do
    for i1:=0 to 7 do OpenFilee.write(b8out[ii,i1],1);

OpenFilee.Free;
CloseFilee.Free;


end;

При запуске программы, конкретно когда запускаю эту процедуру, Windows завершает работу. А что вы изменили? можете скинуть?
Ответить с цитированием
  #11  
Старый 23.05.2014, 04:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

У меня сначло вылезло переполнение стека, изменив размер b8in,b8out с 1го мб до 10ти кб оно исчезло, дальше оказалась перепутана загрузка файла в 2D массив
Код:
for i:=0 to sizefile8 do
    for i1:=0 to 7 do OpenFile.Read(b8in[i,i1],1);
а должно быть как
Код:
for i:=0 to 7 do
    for i1:=0 to sizefile8 do OpenFile.Read(b8in[i,i1],1);
, потом смотрите "циклические" переменные - кое где вместо i (она в этот момент вообще без содержимого) нужно вставить или i4 или i2, вам виднее

Ошибки (почти, много предупреждений от СР) исчезли, файлы открылись/перезаписались, шифровки нет - алгоритм не ведом, другими словами, вот вам юнит, крутите дальше сами

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

key: array[0..9] of byte = (123,60,48,50,89,33,145,97,56,29);

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 nom, razmerhvosta, bs, bs1, s1: byte;
 razmer, change, sxor, sizefile8: int64;
 keyround: array[0..31] of int64;
 b8in, b8out: array[0..7, 0..10000] of byte;
//  b8in, b8out: array[0..7, 0..1000000] of byte;
 openfl, closefl: TFileStream;
i, i1, i2, i4: integer;

const
sbox: array [1..16] of byte = (5,14,15,8,12,1,2,13,11,4,6,3,0,7,9,10);
pbox: array [1..64] 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

//загрузка файлов

OpenFl:=TFileStream.Create('text.txt',fmOpenRead);
OpenFl.Position:=0;

CloseFl:=TFileStream.Create('crypted.bin',fmCreate);
CloseFl.Position:=0;

sizefile8:= OpenFl.Size div 8;


//загрузка файлов


//загрузка файла в двумерный массив

 for i:=0 to 7 do
  for i1:=0 to sizefile8 do OpenFl.Read(b8in[i, i1], 1);

razmerhvosta:= OpenFl.Size - sizefile8 * 8;

if (razmerhvosta > 0) then
   for i2:= i1 to razmerhvosta do OpenFl.Read(b8in[i+1, i2], 1);

if (razmerhvosta < 7) then
    for  i2:=i2 to 7 do OpenFl.Read(b8in[i+1,i2],1);


//загрузка файла в двумерный массив


for i:=0 to 31 do    //генерация клбючей

  begin

  for nom:=0 to 7 do
  begin
  change:= key[nom] shl (8 * (7 - nom));   //сдвиг битов ключа на Х  бит
  Inc(keyround[i], change);
  end;

  change:=keyround[i1];
  razmer:= change shr 60;
//  razmer:=sbox[change];
  razmer:=razmer shl 60;
  change:=razmer + ((change shl 4) shr 4 );

  razmer:=(change shl  44) shr 59;
  razmer:= razmer xor i;
  razmer:=razmer shl 15;

  change:=((change shr 20) shl 20) + ((change shl 49) shl 49) + razmer;

  keyround[i]:=change;

  end;  //генерация ключей

  //i - цмкл сети SP,

  for i4:=0 to (sizefile8 + 1) do

  for i:=0 to 30 do       //сеть SP
    begin

    //Key XOR->  заполняем sxor:int64 байтами входного, ксорим и пишем назад

       for i1:=0 to 7 do  sxor:=sxor + (b8in[i4,i1]) shl (7 - i1);

       sxor:=sxor xor keyround[i];

       for i1:=0 to 7 do b8in[i4,i1]:=sxor shr (7-i1);
       //key xor


       //Sbox перестановка->

       i1:=0;

   for i2:=0 to 7 do
   begin
   Inc(i1);
   nom:=sbox[i1] div 2;
   if (sbox[i1] mod 2 = 0) then begin
                               bs:=b8in[i4,nom] shr 4;
                               bs:=bs shl 4;
                               end
                          else bs:= b8in[i4,nom] shl 4;

   Inc(i1);
   nom:=sbox[i1] div 2;
   if (sbox[i1] mod 2 = 0) then bs1:=b8in[i4,nom] shr 4
                          else begin
                               bs1:=b8in[i4,nom] shl 4;
                               bs1:=bs1 shr 4;
                               end;
   b8out[i4,i2]:=bs+bs1;
   b8in[i4,i2]:=b8out[i4, i2];

  end;

       //<- Sbox перестановка

   //-> Pbox перестановка
      bs1:=0;
      for s1:=0 to 63 do
        begin

        nom:=pbox[s1] div 8;
        bs:=b8out[i4,nom];
        bs:=bs shl (pbox[s1] mod 8);
        bs:=bs shr 7;
        bs:=bs shl (7 - pbox[s1]);

        bs1:=bs1+bs;
        b8out[i4,s1 div 8]:=b8out[i4,s1 div 8]+bs1;
        end;

       //<--Pbox перестановка


   end;                  //сеть SP



   for i:=0 to (sizefile8 + 1) do
    for i1:=0 to 7 do OpenFl.write(b8out[i,i1],1);

OpenFl.Free;
CloseFl.Free;


end;

end.
угу, а утром ещё и на работу ехать, жуть
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter