Цитата:
Сообщение от 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"
|