|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вылетает при загрузке файла
СРОЧНО!!! ЗАВТРА ДИПЛОМ НА ПРОВЕРКУ НЕСТИ!!! ПРОГРАММА ВЫЛЕТАЕТ ПРИ ПОПЫТКЕ ЧТЕНИЯ ФАЙЛА И ЗАПИСИ ДРУГОГО. В ОБЩЕМ ПРОГА ДОЛЖНА ЧИТАТЬ ФАЙЛ И ШИФРОВАТЬ В СООТВЕТСТВИИ С АЛГОРИТМОМ И С ПОМОЩЬЮ КЛЮЧЕЙ. ВЫБРАННЫЙ ФАЙЛ. ВОТ КОД КНОПКИ, КОТОРАЯ ВСЁ ЭТО ЗАПУСКАЕТ:
Код:
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
|
||||
|
||||
1. Не надо все писать капсом. Это невежливо.
2. Не стоит использовать в качестве переменных зарезервированные имена функций работы с файлами, как то OpenFile, CloseFile 3. Запуск вашего кода с точками останова и последующей построчной отладкой, вам поможет намного быстрее. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Цитата:
спасибо. про имена забыл совсем.Насчет третьего пункта, я не могу разобраться как в делфи это сделать. подскажите? |
#4
|
||||
|
||||
1. Можно вообще с самого начала построчно F7
2. В дельфи слева от текста программы есть область, там обычно номера строк. Кликните мышкой в нее и строка выделится красным цветом. Это будет точка останова программы. Теперь если вы запустите ваше приложение F9, то выполнение кода прервется на выделенной строке. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
И опять одни и те же грабли - глобальные переменные под счётчик, нужно переместить все i`шки что задействованы в циклах for..to..do в var-секцию этой процедуры
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
|||
|
|||
Цитата:
все переменные циклов сделал локальными, но при запуске программы winsows завершает работу приложения |
#7
|
||||
|
||||
Покажите пжлст массив key, его содержимое
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#8
|
|||
|
|||
Цитата:
как и просили Код:
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
|
||||
|
||||
Нет слов, - собрал под вашу процедуру сборку, исправил что увидел, делфя лишь ругается на массив, что у вас обозначен как key[i], чтоб запустить нужен он и только он, его описание, а вы что показываете?
З.Ы. Догадался ужо, key: array[0..9] of byte; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 23.05.2014 в 03:40. |
#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..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
|
||||
|
||||
У меня сначло вылезло переполнение стека, изменив размер 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); Ошибки (почти, много предупреждений от СР) исчезли, файлы открылись/перезаписались, шифровки нет - алгоритм не ведом, другими словами, вот вам юнит, крутите дальше сами Код:
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. Я не понял Вашего вопроса, но всё же Вам на него отвечу! |