|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
|||
|
|||
Если поможет
|
#3
|
|||
|
|||
Во-первых, есть такая встроенная функция IntToHex.
Во-вторых. Обычно винда "срубает" программу когда происходит попытка записи в защищенную область памяти. Скорее всего это результат того, что у тебя какой-либо указатель не инициализируется или происходит выход за пределы массива, что не проверяется. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
vankai14 (27.05.2014)
|
#4
|
|||
|
|||
скорее всего вот это располагается в стеке
fin,fout: array[0..10000000] of int64; вытащите в глобалы |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
vankai14 (27.05.2014)
|
#5
|
|||
|
|||
Цитата:
Спасибо! не вылетает))) только теперь проблема другая... зашифрованный файл получается размером 100 Мегабайт из исходного 1 килобайт(( |
#6
|
|||
|
|||
А что и сколько Вы пишете здесь ?
Код:
CloseF.Write('crypted.dat',fout[ifile]); |
#7
|
|||
|
|||
Цитата:
После чтения файла в массив fin[x..x] типа int64, в цикле от нуля до количества считанных из файла блоков к каждому fin[N] применяется ряд преобразований. ксорится с ключом keyround[N], потом замены и перестановки. и вот как раз результат всех этих преобразований пишется в массив FOUT[N]. Есть чуйка, что я как-то неправильно записываю выходной массив в файл 'crypted'. В результате по идее должен получиться файл непонятный. такой, что если исходный был *.txt, то если открыть его через блокнот, там непонятный символы. ИЛИ если исходный - *.jpg, то выходной открывая через imageviewer какой-нибудь, тоже непонятная картинка появится. Потом в результате расшифровки по тому же алгоритму, но с ключами в обратном порядке из FOUT получается FIN, полностью соответствующий исходному файлу. Расшифровку я дописал, но опять же получаются бредовые выходгные данные. может подскажите если я как-то неправильно файлы загружаю и выгружаю? |
#8
|
|||
|
|||
Я имел ввиду, посмотреть в справке параметры функции TStream.Write, и сравнить с теми, что Вы туда подаёте
|
#9
|
|||
|
|||
Цитата:
А так не правильней будет как считаете? разбивать и писать по 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
|
|||
|
|||
Уточняю - у 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
|
|||
|
|||
Цитата:
Точно! Спасибо)) по привычке написал как в ассигнфайл. |
#12
|
|||
|
|||
Цитата:
вот только, в таком варианте Код:
CloseF.Write(fout[0],sizeof(fout[0])*ifile); он же будет записыывать sizeof(fout[0])*ifile раз, не так ли? или это позиция? |
#13
|
|||
|
|||
Цитата:
переписал немного. теперь выходной файл загружаю через ассигн. так как когда через файлстрим делаю, в выходном бред, который не сходится с оригиналом Код:
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
|
||||
|
||||
Цитата:
Цитата:
|
#15
|
|||
|
|||
Кстати, если описываешь
Код:
trydec:file; Код:
rewrite(trydec,1); |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
alyan (29.05.2014)
|