Compiled .NET programs can be decompiled, just as any computer program can but it's a bit easier in .NET than in X86 Assembler. For example the next version of my Debug library will be able to debug programs in the IDE as well as optimised compiled. This is primarily for use on the device where there is no real debugger available. Erel will add the necessary "hooks" into the next version of Basic4ppc but for testing I decompiled the device version of Basic4ppc with a Reflector plug-in, added the necessary hooks and recompiled it so I now have complete source code for a customised version of Basic4ppc for the device that I have used to develop the IDE capable version of my Debug library

. Erel does of course know this and has had a copy of it.
Taking your optimised compiled program apart would be similarly easy to see what you have done with the key

. There are programs called "obfuscators" that attempt to scramble the code after compiling by making names meaningless and doing other tricks to change the code, but the fact remains that if a processor CPU has to execute the code it can always, perhaps with a lot of effort, be dismantled to see what it does.