Se as pessoas tiverem acesso físico ao computador que está executando seu código, elas terão acesso ao seu código. Se você não quer que as pessoas tenham acesso ao seu código, não lhes conceda acesso.
Criptografar o código não é útil no cenário que você descreve. O computador tem que descriptografar o código para executá-lo. Se o computador puder descriptografar o código, ele deverá ter a chave de descriptografia em algum lugar, e qualquer pessoa com acesso físico também poderá descriptografar o código.
A exceção a isso é se o computador oferece um ambiente de execução seguro que é fisicamente protegido. Os Smartcards oferecem esse ambiente e são relativamente baratos, mas têm um poder computacional muito limitado. (Observe que um cartão inteligente apenas para armazenar a chave do código criptografado que está em um computador maior não o ajudará, já que o computador maior será o alvo do ataque, não o cartão inteligente.) Os módulos de segurança de hardware também oferecem esse ambiente e são mais ou menos tão poderosos quanto um PC de baixo custo, mas são muito caros. Alguns computadores com um ambiente protegido com base em Intel SGX ou ARM TrustZone oferece um nível intermediário de proteção contra ataques físicos" casuais "apenas (abra o caso, mas não tente quebrar os chips).
Mas, realisticamente, o custo da engenharia reversa de um binário não é tão trivial e o custo de manutenção do código-fonte é muito alto. Se o seu aplicativo for útil, é extremamente raro que medidas de segurança adicionais venham a valer comercialmente: o que você realmente está vendendo é o suporte.