program crypto;
begin
randomize;
//1.1 Загружаем библиотеку. Пояснения к переменным для слабаков.
write('Load lib.');
var libt:=new System.IO.StreamReader('lib.txt',System.Text.Encoding.Default);
var text_lib:=libt.ReadLine;
var index_lib:=1;
var byte_lib:array of string;
var simb_lib:array of string;
var kl:=128;
setlength(byte_lib,kl);
setlength(simb_lib,kl);
for var i:=0 to kl-1 do begin
byte_lib[i]:=copy(text_lib,index_lib,7);
index_lib:=index_lib+7;//write(byte_lib[i]);
simb_lib[i]:=copy(text_lib,index_lib,1);
index_lib:=index_lib+1;//writeln(' ',simb_lib[i]);
end;
libt.Close;
writeln('/ok');
//1.1 Загрузили библиотеку.
//1.2 Загрузка input.txt или исходного текста. + 1.3 Перевод в биты.
write('Load text.');
var input_t:=new System.IO.StreamReader('input.txt',System.Text.Encoding.Default);
var text_in:=input_t.ReadLine;
var byte_in:array of string; //Блоки битов к существующим символам.
var simb_in:array of string; //Сами символы.
var ki:=length(text_in);
setlength(byte_in,ki);
setlength(simb_in,ki);
for var i:=0 to ki-1 do simb_in[i]:=copy(text_in,i+1,1);
//1.2 Загрузили input.txt
writeln('/ok');
write('Making bits.');
for var i:=0 to ki-1 do begin
for var j:=0 to kl-1 do begin
if simb_in[i]=simb_lib[j] then byte_in[i]:=byte_lib[j]
else byte_in[i]:=byte_lib[127];
//if simb_in[i]=simb_lib[j] then writeln(simb_in[i],'-->',byte_in[i]);
end;
end;
//1.3 Создали блоки и перевели в биты.
writeln('/ok');
//1.4 Генерируем позиции и смещения. В общем, ключи.
write('Generating keys.');
var num:array[,]of integer;
var way:array[,]of boolean;
var t,n,m:integer;
t:=7;n:=ki;m:=3;
num:=new integer[n,m];
way:=new boolean[n,m];
var ggg:integer;
for var i:=0 to n-1 do begin
for var j:=0 to m-1 do begin
num[i,j]:=random(t);
ggg:=random(10);
if ggg<5 then way[i,j]:=true;
if ggg>=5 then way[i,j]:=false;
end;
end;
writeln('/ok');
write('Parcing keys.');
var quality:=1000;
for var q:=0 to quality do begin
for var i:=0 to n-1 do begin
for var j:=0 to m-1 do begin
for var g:=0 to m-1 do begin
if j<>g then begin
if num[i,j]=num[i,g] then begin
num[i,j]:=random(t);
end;
end;
end;
end;
end;
for var i:=0 to n-1 do begin
for var j:=0 to m-1 do begin
for var g:=0 to m-1 do begin
if j<>g then begin
if num[i,j]+1=num[i,g] then way[i,j]:=false;
if num[i,j]-1=num[i,g] then way[i,j]:=true;
end;
end;
end;
end;
for var i:=0 to n-1 do begin
for var j:=0 to m-1 do begin
if num[i,j]=t-1 then way[i,j]:=true;
if num[i,j]=0 then way[i,j]:=true;
end;
end;
end;
//1.4 Закончили. NOOOOPE! A ne, закончили.
writeln('/ok');
//1.5 Сам процесс шифровки.
write('Crypting.');
var t1,t2,code:string;
var tr:boolean;
for var i:=0 to n-1 do begin
code:='';
for var j:=0 to t-1 do begin
tr:=false;
for var g:=0 to m-1 do begin
if j=num[i,g] then begin
if way[i,g]=true then begin
code:=code+copy(byte_in[i],(num[i,g]-1),1);
tr:=true;
end;
if way[i,g]=false then begin
code:=code+copy(byte_in[i],(num[i,g]+1),1);
tr:=true;
end;
end;
end;
if tr=false then code:=code+copy(byte_in[i],j+1,1);
end;
byte_in[i]:=code;
end;
//1.5 Закончили!
writeln('/ok');
//1.6 Перевод в символьный тип
write('Making output text.');
var text_out:string;text_out:='';
for var i:=0 to n-1 do begin
for var j:=0 to kl-1 do begin
if byte_in[i]=byte_lib[j] then text_out:=text_out+simb_lib[j];
end;
end;
//1.6 Перевели.
writeln('/ok');
//writeln('Output text : ',text_out);
//1.7 Saving.
write('Saving output_text.txt ...');
var otpt:=new System.IO.StreamWriter('output_text.txt',false,System.Text.Encoding.Default);
otpt.Write(text_out);
otpt.Close;
//1.7 Saved.
writeln('/ok');
//1.8 Saving.2.
var otpk:=new System.IO.StreamWriter('output_keys.txt',false,System.Text.Encoding.Default);
write('Saving output_keys.txt ...');
for var i:=0 to n-1 do begin
for var j:=0 to m-1 do begin
otpk.Write(num[i,j]);
if way[i,j]=true then otpk.Write('t');
if way[i,j]=false then otpk.Write('f');
end;
end;
writeln('/ok');
otpk.Close;
write('Ok.');
sleep(250);halt;
end.