加密& Decrypt String Routine ASM x86

时间:2015-03-16 16:35:18

标签: assembly encryption cryptography x86

基本上我试图创建一个加密输入字符串的程序&然后使用ASM x86将其解密回原来的状态。

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

我在编写解密功能时遇到问题。我开始只是反转加密的每一行(推动ecx更改为pop ecx等),但已被告知这不正确。

这是主要的加密功能:

void encrypt_chars (int length, char EKey){
char temp_char;                     // char temporary store

for (int i = 0; i < length; i++)    // encrypt characters one at a time
{
    temp_char = OChars [i];         //
    __asm {                         //
        push   eax                  // save register values on stack to be safe
        push   ecx                  //
                                    //
        movzx  ecx,temp_char        // set up registers (Nb this isn't StdCall or Cdecl)
        lea    eax,EKey             //
        call   encrypt              // encrypt the character
        mov    temp_char,al         //
                                    //
        pop    ecx                  // restore original register values from stack
        pop    eax                  //
    }
    EChars [i] = temp_char;         // Store encrypted char in the encrypted chars array
}

返回;

子程序&#39;加密&#39;:

       encrypt: push esi
              push ecx
              mov  esi, eax
              and dword ptr[esi], 0xFF
              ror byte ptr[esi], 1
              ror byte ptr[esi], 1
              add byte ptr[esi], 0x01
              mov ecx, [esi]
              pop edx
          x17 : ror dl, 1
                dec ecx
                jnz x17
                mov eax, edx
                add eax, 0x20
                xor eax, 0xAA
                pop esi
                ret

输入: 注册EAX = Ekey的32位地址, 注册ECX =要加密的字符(在低8位字段中,CL)

输出: 寄存器EAX =源字符的加密值(在低8位字段AL中)。

有人可以告诉我(或指向我可以找到的某个地方)哪些线路需要逆转解密功能?

提前感谢您的任何答案!

1 个答案:

答案 0 :(得分:1)

试试这个:

decrypt: push   esi
         push   ecx
         mov    esi, eax
         and    dword ptr [esi], 0xFF
         ror    byte ptr [esi], 1
         ror    byte ptr [esi], 1
         add    byte ptr [esi], 1
         mov    ecx, [esi]
         pop    eax
         xor    eax, 0xAA
         sub    eax, 0x20
         and    eax, 0xFF
   x18:  rol    al, 1
         dec    ecx
         jnz    x18
         pop    esi
         ret

为什么要在装配中这样做?您可以使用移位运算符或表查找来模拟左右位旋转。