1. A software protection system comprising: a memory system configured to store a software program comprised of a plurality of program instructions each comprising an opcode and an operand, wherein the plurality of program instructions, when executed, have a program order; and a microprocessing system coupled to the memory system and configured to, when executing the software program, determine a next program instruction of the plurality of program instructions in the program order based on an order identifier, fetch the next program instruction from the memory system, compare the opcode of the next program instruction against a template comprising a group of unencrypted opcodes to determine if the next program instruction requires decrypting, decrypt the next program instruction responsive to determining that the next program instruction requires decrypting, and execute the next program instruction.