编辑:对于新代码,见底部
这段代码很奇怪,但它似乎在做这样的事情:(未测试)
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。XOR 和 NOT 是它们自己的逆。
因为我弄错了密钥和数据,所以我弄错了。其实应该是这样的:(也未测试)
; 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
因为对密钥进行的操作不应该是逆运算。