-4

有谁知道如何解密以下加密例程?基本上我有一个加密密钥,我输入它,然后我被要求输入一个 6 个字母的单词,然后被加密。我该如何解密这个?谢谢

加密:

      push edx 
      push ecx 
      not eax 
      add eax,0x04 
      mov edx,eax 
      pop eax 
      xor eax,edx 
      pop edx 
      rol al,1 
      rol al,1
      rol al,1 
      sub al,0x02 
      ret 
4

1 回答 1

2

编辑:对于新代码,见底部

这段代码很奇怪,但它似乎在做这样的事情:(未测试)

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

因为对密钥进行的操作应该是逆运算。

于 2012-07-26T21:20:14.897 回答