作为一项任务,我已经获得了一些汇编代码,它从用户那里获取输入(加密密钥),然后是一串字母数字字符,然后通过简单地加扰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
}
答案 0 :(得分:4)
您没有发布,但由于这是第三次有人请求
这个完全类型的练习要解决,我假设EAX
有一个指针
到当前密钥char和ECX
保持当前消息char(即char为
加密)。
这是一个非常简单的无状态算法,我注释了每个有用的指令 我假设您了解集会,如果您不能在网上接受教程 没有什么可以添加到这个反向引擎,代码是等价的(甚至 由于垂直分裂成简单的操作,更加清晰到高水平 简单的源代码
;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
表示密钥字符。
你必须知道所使用的每个函数的反函数,这是微不足道的,但这里是列表
f | f^-1
-------+-------
XOR | XOR
NEG | NEG
ROL | ROR
ROR | ROL
然后你从outern函数开始向内部,记住你瞄准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))
。
您可以轻松地在汇编中对上面的表达式进行编码。
仔细检查上述陈述,我没有运行代码也没有进行任何测试 你应该检查一些细微的修正,使用你的批判意识,不要复制粘贴任何公式 如果你盲目地相信其他一个代码,那么如果你的测试失败,它就取决于你。
我可以问你这个练习的背景是什么?这是汇编编程课程的作业吗?