加密到解密例程asm x86

时间:2014-08-04 13:48:07

标签: assembly encryption x86

基本上我有一个用asm编写的加密子例程,需要在asm中转换成解密例程。假设该程序在将其再次解密为原始字符串之前对其进行加密。

       push ecx
       xchg eax,ecx
       neg  al
       ror  al,1 
       xor  al,byte ptr[ecx]
       push edx
       mov  edx,eax 
       xchg eax,ecx 
       rol  byte ptr[eax],3
       xor  dl,byte ptr[eax]
       rol  dl,2
       mov  eax,edx
       pop  edx
       pop  ecx

我在编写解密例程时遇到问题。我开始只是反转加密的每一行(推送edx更改为pop edx等),但我被告知这是不正确的,如果我想要正确解密字符串。

有人能告诉我哪些线路需要逆转解密程序吗?

如果它有帮助,这是主要的加密例程。

for (int i = 0; i < length; i++){
    temp_char = OChars [i];         
    __asm {                         
        push   eax                  
        push   ecx
        movsx  ecx,temp_char        
        lea    eax,EKey             
        call   encrypt              
        mov    temp_char,al         
        pop    ecx                  
        pop    eax                  
    }
    EChars [i] = temp_char;

程序接受一个加密密钥,这是一个随机字符,然后加密到目前为止的6个字符串。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

因此,当事物加密时,从明文字节'p'和键字节'k'开始,在它的初始状态'k(0)',它继续:

  a    = -p
  b    = ror(a, 1)
  c    = b xor k(0)
  k(1) = rol(k(0), 3)
  d    = c xor k(1)
  e    = rol(d, 2)

所以要扭转这一点:

  d    = ror(e, 2)
  c    = d xor k(1)    // xor being its own inverse
  k(0) = ror(k1, 3)
  b    = c xor k(0)
  a    = rol(b, 1)
  p    = -a            // - being its own inverse

显然,问题在于解密以k(0)开始,并且在第一个字节想要为k(1)(对于下一个字节)之后,而不是相反,所以我们需要:

  t    = k(0)           // temporary copy of k(0)
  k(1) = rol(k(0), 3)   // so same as encrytption
  d    = ror(e, 2)
  c    = d xor k(1) 
  b    = c xor t
  a    = rol(b, 1)
  p    = -a

现在我注意到b = d xor k1 xor t,而xor是可交换的,所以事实上,上述内容可以在不需要t的情况下完成。