編集:新しいコードについては、下部を参照してください
このコードは奇妙ですが、次のようなことをしているようです: (未テスト)
char encrypt(char a, int c)
{
    int t = 4 + ~a;        // the NOT and the ADD
    int t2 = (c ^ t) & 0xFF;  // the XOR
    int t3 = ((t2 << 3) | (t2 >> 5)) & 0xFF;  // the three ROL's
    return (char)(t3 - 2);   // the SUB
}
対応する復号化は、次のようになると思います: (未テスト)
char decrypt(char a, int c)
{
    int t = (a + 2) & 0xFF;
    int t2 = ((t >> 3) | (t << 5)) & 0xFF;
    int t3 = t2 ^ c;
    return (char)~(t3 - 4);
}
アセンブリのどれがこれになる可能性がありますか:(テストされておらず、混乱していません)
add al, 2
ror al, 3   ; or three times ror al, 1
xor al, cl
sub al, 4
not al
ret
または、「ほぼ32ビット」で実行できます:(これもテストされていません)
add eax, 2
ror al, 3
xor eax, ecx
sub eax, 4
not eax
movzx eax, al  ; or just ignore everything but the low byte
ret
何もテストされていませんが、私が使用した一般的な戦略は次のとおりです。左に 3 回転する場合は、右に 3 回転します。4 を足すと、4 を引きます。
鍵とデータを混同してしまったので間違えてしまいました。実際には、次のようにする必要があります: (これもテストされていません)
; eax = EKey, cl = char
decryptB:
  add ecx, 2   // undo sub 2
  ror cl, 3    // undo rol
  not eax      // actually do not
  add eax, 4   // actually do add 4
  xor eax, ecx // undo xor
  ret
キーに対して行われる操作は逆であってはならないためです。