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;