Il motore polimorfico (polymorphic engine) ideale è generalmente definito come un programma che può trasformare un blocco di codice in un altro blocco di codice che avrà esattamente la stessa funzionalità del precedente. Tutte le possibili trasformazioni di un blocco, sono tutte istanze differenti dello stesso codice originale. Queste istanze non condividono pattern prevedibili, poiché la presenza di tali pattern può essere usata per dedurre la presenza del codice cifrato che il motore intende nascondere.
Il metodo comunemente più usato è molto lontano da quello ideale. Esso consiste nello applicare un loop di cifratura su un certo codice (vedi paragrafo 5.2), e prependere una routine al blocco di codice cifrato che lo decifrerà, e poi passargli il controllo come se il codice non fosse mai stato cifrato.
Per mantenere più fedele il tutto al modello ideale, anche la routine di decodifica deve variare, ed è questo il punto dove si presentano i benefici reali di questo approccio. Invece di dover variare un grosso blocco di codice, soltanto la routine di decifratura ha bisogno di essere variata, e poiché la routine ha tipicamente una dimensione di circa 10 istruzioni, il vantaggio che se ne ricava è ovvio.
L'algoritmo di decodifica è mantenuto il più semplice possibile, poiché la complessità della routine di decifratura è in relazione diretta con la complessità del codice necessario a variarla con successo. Uno schema di cifratura come quello di Cesare sarebbe vergognoso da usare: solitamente un round di una operazione, trasforma ciascuna unità elementare di dati U nel suo ciphertext equivalente U'. Anche se ciò non è realmente una cifratura, la terminologia è semplificata quando tutto ciò è visto come una cifratura.
Il codice è trasformato unità per unità, tipicamente un byte o una
word alla volta. La procedura di de-trasformazione esegue semplicemente le operazioni
inverse. Le operazioni di trasformazione più usate sono ADD, SUB, XOR (che denotiamo
con ) e rotazioni di bit (che denotiamo con
oppure con
).
Tutti gli operatori sono binari ed usano una chiave K tale che:
.