1. A method of protecting computer program code, comprising the acts of: providing a file of computer program source code which defines at least one logic operation on two pieces of data; storing the file in a first computer readable storage medium; locating a portion of the code which performs the logic operation; defining first and second functions which are injective; in a processor coupled to the first storage medium, substituting in the code the first function applied to the first piece of data for the first piece of data; substituting in the code the second function applied to the second piece of data for the second piece of data; substituting in the code an arithmetic operation for the logical operation; providing in the code a recovery function which recovers a result of the logic operation from the substituted code; and storing the code with the substitutions and recovery function in a second computer readable memory coupled to the processor.