For each block, let us call it page[x,y] where 0<=x<wide and 0<=y<high:
(it is understood that each line is for all x<wide and for all y<high)
-----------------------------------------------------------------------
   1) Do one shuffle:
	 page[x,y] := page[x,(y+key[x]) mod high]
	 if y is odd then page[x,y] := (page[x,y] XOR page[x,y-1])+1 mod 256
	 page[x,y] := page[(x+(y mod (wide-1))+1) mod wide,y]

   2) Perform a simple substitution:
	 page[x,y] := page[x,y] XOR ((x*high+y)*7 mod 256)

   3) Do 9 shuffles:
	 page[x,y] := page[x,(y+key[x]) mod high]
	 if y is odd then page[x,y] := (page[x,y] XOR page[x,y-1])+1 mod 256
	 page[x,y] := page[(x+(y mod (wide-1))+1) mod wide,y]

Each step in the process is easily reversible.
-------------------------------------------------------------------------

The encrypted file format is:
	1) Three decimal integers: program version number (= 3), wide, high.
	   Each as chars terminated by a comma (i.e. C format "%d,%d,%d,").
	2) for each block:
	      The real number of characters in the block as a comma
	      terminated decimal integer (i.e. C format "%d,").
	      The block of bytes:
		 for (j:=0..high-1), for (i:=0..wide-1) page[i,j]

-------------------------------------------------------------------------
