【问题标题】:Assembly code. Encryption to Decryption Routine汇编代码。加密到解密例程
【发布时间】:2013-07-25 12:40:48
【问题描述】:
  • 有人可以帮我看看这个并帮助我计算出一个可以反转用户输入的字符串的解密方法。我并不是说只是做这个过程的相反。

      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
    

    *

寄存器是: Inwards- ecx:加密密钥。 eax:要加密的字符。

Outwards-eax:加密字符

感谢您花时间查看。

【问题讨论】:

  • 您有任何具体问题吗? “帮助我”并不是那么具体。
  • 问题出在哪里?你有测试数据吗?
  • 完全一样的代码。几乎整整一年之后。是大学课程还是什么?
  • 感谢大家的反馈。我实际上正在为我的新工作做一个短期课程。谢谢@harold,它与一年前的问题完全相同。我已经在visual studio中尝试过解决方案,但是程序不断中断,我得到:未处理的异常在0x772c15de0xC0000005:访问冲突。在相同的错误消息中转到 crtexe.c 有人对此有任何想法吗?

标签: assembly encryption x86 cpu-registers cpu-architecture


【解决方案1】:

算法是对称的,因为我可以解密每个字符和密钥组合。

通过循环测试这两个函数在解密返回值时是否有任何错误:

#include <iostream>
using namespace std;

unsigned char enc(unsigned char ch, unsigned char key)
{
    unsigned char tmp = key^(~ch+(unsigned char)0x04);
    return (( (tmp<<3) | (tmp>>5) ) & 0xff)-0x02;
}

unsigned char dec(unsigned char ch, unsigned char key)
{
    unsigned char tmp = (ch+0x02);
    tmp = ((tmp>>3) | (tmp<<5)) & 0xff;
    return ~((tmp^key )-(unsigned char)0x04);
}

int main()
{
    // single encryption test
    char c = 'A';
    char key = 'K';
    cout << "single test:" << (char)enc(c, key) << endl;

    bool problem = false;
    int k, ch;
    for(k=0;k<256;k++)
    {

        for(ch=0;ch<256;ch++)
        {
            if( enc( dec((unsigned char)ch, (unsigned char)k), k) != ch )
            {
                problem = true;
                cout << "error k=" << k << "c=" << ch
                     << "result=" <<  (unsigned int)enc( dec((unsigned char)ch, (unsigned char)key), (unsigned char)key) << endl;

            }
        }
    }
    if(problem) cout << "There was a problem." << endl;
    else cout << "There was no problem." << endl;
}

【讨论】:

    最近更新 更多