如何恢复加密过程

How to revert an Encryption process

作为一项任务,我得到了一些汇编代码,这些代码从用户那里获取输入(加密密钥),然后是一串字母数字字符,然后通过简单地打乱字节顺序来加密EAX、EDX 和 EXD 寄存器(据我了解。)

我的任务是获取加密字符串并将其解密回原始字符串输入。

我首先尝试反转加密过程的步骤(即将 rol 更改为 ror 等),但很快意识到这行不通。

如果有人能花时间解释如何制作解密过程/代码,那么我将不胜感激。

    __asm {
    encryptX:  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                    
        ret                         
    }

你没有post,但由于这是第三次有人请求 这 exact 种要解决的练习,我假设 EAX 持有一个指针 到当前键字符和 ECX 保存当前消息字符(即要 加密)。

1。反向引擎算法

这是一个非常简单的无状态算法,我对每个有用的指令都做了注释。
我假设您了解汇编,如果不了解,您可以在线学习教程。
这个逆向工程没有什么要补充的了,代码是等价的(甚至 由于垂直拆分为简单的操作而更加清晰)到高层 简单的源代码

;EAX = ptr to current key char, k
;ECX = current message char, c

encryptX:  
        push ecx

        xchg eax, ecx             ;EAX = c, ECX = ptr k
 
        neg  al                   ;AL = NEG(c)       
        ror  al, 1                ;AL = ROL(NEG(c), 1)
        xor  al, byte ptr[ecx]    ;AL =  ROL(NEG(c), 1) xor k
   
        push edx                    

        mov  edx, eax             ;EDX =  ROL(NEG(c), 1) xor k    
        xchg eax, ecx             ;EAX = ptr k, ECX = ROL(NEG(c), 1) xor k 

        rol  byte ptr[eax], 3     ;K = ROL(k, 3)  
        xor  dl, byte ptr[eax]    ;DL = (ROL(NEG(c), 1) XOR k)  XOR ROL(k, 3)  
        rol  dl, 2                ;DL = ROL((ROL(NEG(c), 1) XOR k)  XOR ROL(k, 3), 2)

        mov  eax, edx         ;Return
             
        pop  edx                    
        pop  ecx                    
        ret  

算法是e = ROL((ROR(NEG(c), 1) XOR k) XOR ROL(k, 3), 2)

我用 e 表示加扰字符,用 c 表示原始字符,用 k 表示密钥字符。

2。反转函数

您必须知道所使用的每个函数的反函数,这很简单,但这是列表

 f     |  f^-1
-------+-------
  XOR  |  XOR
  NEG  |  NEG
  ROL  |  ROR
  ROR  |  ROL

然后你从外函数开始向内函数,记住你的目标是c

0. e = ROL((ROR(NEG(c), 1) XOR k)  XOR ROL(k, 3), 2)

1. ROR(e, 2) = (ROR(NEG(c), 1) XOR k)  XOR ROL(k, 3)

2. ROR(e, 2) XOR ROL(k, 3) = ROR(NEG(c), 1) XOR k

3. ROR(e, 2) XOR ROL(k, 3) XOR K = ROR(NEG(c), 1)

4. ROL(ROR(e, 2) XOR ROL(k, 3) XOR K, 1) = NEG(c)

5. NEG(ROL(ROR(e, 2) XOR ROL(k, 3) XOR K, 1)) = c

解扰是 c = NEG(ROL(ROR(e, 2) XOR ROL(k, 3) XOR K, 1)).

3。在汇编中实现

您可以在汇编中轻松编写上述表达式。


警告

仔细检查上面的陈述,我没有运行代码也没有做任何测试。
您应该检查细微的更正,使用您的批判意识,不要复制粘贴任何公式。
如果你盲目相信别人的代码,那么你考不及格就看你的了。


请问这个练习的背景是什么?这是您的汇编编程课程的作业吗?