LB2's answer is a good way to start (making sure the program itself is encrypted).
If I wanted a very high level of security, I'd push it a bit farther and implement 2-factor authentication. LB2's answer takes care of the something you know part.
I suggest splitting your program into 2 (or more) pieces (say a main and a library), so that neither part can accomplish anything without the other part (you will have to be smart about how and where you split the code). It would also be wise to encrypt the 2nd part, as to limit the knowledge a malicious user could gain if they ever put their hand on it. (I guess the 2nd part should not be encrypted with the same key as the first part, so you could embed the key to the 2nd part inside the code of the 1st part...)
This way, you'd need something you know (the encryption key) and something you have (the other piece of the program, maybe held on a USB key) to actually run the program.
(Edit) Now that I think about it, you should also use the fact that the program is only going to be run on a single machine. A critical part of the program should be secured so it can only be run on a specific device (use static data tied to the machine as opcodes or encryption keys...) An attacker stealing the code won't be able to run the software without the device (at least if he hasn't grabbed a copy of the static data).