Fenya 256 / Fencry key scheduling algorithm. 40.000 keys.

procedure keymake();

var

e, j, g, h, u : Integer ;


begin

for e := 1 to 40000 do // removes any remaining value;

begin

n[e] := 0;

m[e] := 0;

end;

for u := 1 to 32 do

begin

key[u] := 0;

end;

end;


if Length(form1.Edit2.Text) > 31 then // Waits for all 32 characters of the main key are filled in.

begin

g := 1;

for j:= 1 to 32 do

begin

key[j] := Ord(form1.Edit2.Text[j]); // loading main key in to key[]

end ;



//Starting


for j:= 1 to 40000 do //

begin

n[j] := key[g];

inc(g);

if g > 31 then

begin

g := 1;

end;

end;



//Chain reverse ***************

for j:= 39999 downto 1 do

begin

n[j] := (n[j] + n[j+1]) mod 256;

end;

 

//Itensive, creates a small rise of zero, but at a very early stage **************


for j:= 1 to 40000 do //

begin

n[j] := (n[j] * n[40001-j]) mod 256; //

end;


//Chain ***************

for j:= 2 to 40000 do //

begin

n[j] := (n[j] + n[j-1]) mod 256;

end;


g := 1;

for j:= 1 to 40000 do //

begin

n[j]:= n[j]+ (fenja16.sessionkey[g]) mod 256; // Loading the 256 bits open random key / initialization vector.

inc(g);

if g > 31 then

begin

g := 1;

end;

end;



//Chain revers ***************

for j:= 39999 downto 1 do

begin

n[j] := (n[j] + n[j+1]) mod 256;

end;



g := 1;

for j:= 1 to 40000 do

begin

n[j] := (n[j] + key[g]) mod 256;

inc(g);

if g > 31 then

begin

g:= 1;

end;

end;



//Chain ***************

for j:= 2 to 40000 do

begin

n[j] := (n[j] + n[j-1]) mod 256;

end;



g := 32; // 32 in order to run backwards

for j:= 1 to 40000 do

begin

n[j] := (n[j] + key[g]) mod 256;

dec(g);

if g < 2 then

begin

g := 32;

end;

end;

//Chain revers ***************

for j:= 39999 downto 1 do

begin

n[j] := (n[j] + n[j+1]) mod 256;

end;



// Every key added to all the previous.
// This is very CPU intensive

for j:= 1 to 40000 do

begin

form1.ProgressBar1.Position := j;

for h := 1 to (j) do

begin

m[j] := m[j] + (n[h]) mod 256; // stored for later use adds to complexity

end;

end;


//Chain ***************

for j:= 2 to 40000 do

begin

n[j] := (n[j] + n[j-1]) mod 256;

end;

// Every key added to the all the pervious.
// This is very CPU intensive

for j:= 1 to 40000 do

begin

form1.ProgressBar1.Position := (40000+j);

for h := 1 to (j) do

begin

m[40001 - j] := m[40001 - j] + (n[40000 - h]) mod 256; // stored in m for later use. Adds to complexity.
    

end;

end;



//Chain reverse ***************

for j:= 39999 downto 1 do

begin

n[j] := (n[j] + n[j+1]) mod 256;

end;



for j:= 1 to 40000 do // Another round.

begin

n[j]:=(n[j]+key[2]+key[4]+key[6]+key[8]+key[10]+key[12]+key[14]+key[16]) mod 256;

end;

 

//Chain ***************

for j:= 2 to 40000 do

begin

n[j] := (n[j] + n[j-1]) mod 256;

end;

for j:= 1 to 40000 do // Another round.

Begin

n[j] := (n[j]+key[1]+key[3]+key[5]+key[7]+key[9]+key[11]+key[13]+key[15]) mod 256;

end;

//Chain reverse ***************

for j:= 39999 downto 1 do

begin

n[j] := (n[j] + n[j+1]) mod 256;

end;



for j:= 1 to 40000 do // Another round.

Begin

n[j] := (n[j]+key[18]+key[20]+key[22]+key[24]+key[26]+key[28]+key[30]+key[32]) mod 256;

end;



//Chain ***************

for j:= 2 to 40000 do

begin

n[j] := (n[j] + n[j-1]) mod 256;

end;

for j:= 1 to 40000 do // Another round.

Begin

n[j] := (n[j]+key[17]+key[19]+key[21]+key[23]+key[25]+key[27]+key[29]+key[31]) mod 256;

end;


//Chain reverse ***************

for j:= 39999 downto 1 do

begin

n[j] := (n[j] + n[j+1]) mod 256;

end;


//Finaly n array is added with m array.

for j:= 1 to 40000 do

begin

n[j] := (n[j] + m[j]) mod 256;

end;

end;