program otp;

var inp, outp : file of char;
    p,c,k : char;

const kluc = 0; { kluc sifrovania }

{ generator pseudonahodnych cisel }

var
  my_randx: longint;

procedure my_seed(s: longint);
{ pociatocna inicializacia generatora}
begin
  my_randx := s;
end;

function my_rand: real;
{ generuje nahodne cislo v intervale <0,1) }
begin
  { prechod do dalsieho stavu generatora }
  my_randx := (8121 * my_randx + 28411) mod 134456;
  { vypocet navratovej hodnoty }
  my_rand := real(my_randx) / real(134456);
end;


begin
  { ukazka sifrovania }

  Assign(inp, 'sprava.txt');
  ReSet(inp);
  Assign(outp, 'sprava_enc.txt');
  ReWrite(outp);

  my_seed(kluc); { inicializacia generatora, v nasom pripade kluc }
  while not Eof(inp) do begin
    Read(inp, p);
    p := UpCase(p);
    if (p >= 'A') and (p <= 'Z') then begin
      k := chr(65 + trunc(26 * my_rand)); { generovanie pismena kluca }
      c := chr(((ord(p) - 65 + (ord(k) - 65)) mod 26) + 65); { sifrovanie }
      write(outp, c);
    end else begin
      write(outp, p);
    end;
  end;

  Close(inp);
  Close(outp);

  { ukazka desifrovania }

  Assign(inp, 'sprava_enc.txt');
  ReSet(inp);
  Assign(outp, 'sprava_dec.txt');
  ReWrite(outp);

  my_seed(kluc); { inicializacia generatora, v nasom pripade kluc }
  while not Eof(inp) do begin
    Read(inp, c);
    c := UpCase(c);
    if (c >= 'A') and (c <= 'Z') then begin
      k := chr(65 + trunc(26 * my_rand)); { generovanie pismena kluca }
      p := chr((ord(c) - 65 - (ord(k) - 65) + 26) mod 26 + 65); { desifrovanie }
      write(outp, p);
    end else begin
      write(outp, c);
    end;
  end;

  Close(inp);
  Close(outp);

end.
