Assembly x86汇编语言解密
代码的第一位是加密bi,它对一个六个字符的字进行加密,并且它可以正常工作Assembly x86汇编语言解密,assembly,encryption,x86,Assembly,Encryption,X86,代码的第一位是加密bi,它对一个六个字符的字进行加密,并且它可以正常工作 push ebp mov ebp,esp push edx push ecx push eax movzx eax,byte ptr [eax] rol al,1 rol al,1 rol al,1 mov edx,eax pop eax mov byte ptr [eax],dl pop ecx xor ecx,edx mov eax,ecx ror al,1 ror al,1 ror
push ebp
mov ebp,esp
push edx
push ecx
push eax
movzx eax,byte ptr [eax]
rol al,1
rol al,1
rol al,1
mov edx,eax
pop eax
mov byte ptr [eax],dl
pop ecx
xor ecx,edx
mov eax,ecx
ror al,1
ror al,1
ror al,1
pop edx
pop ebp
代码的第二位是我修改过的解密位,但是它不能正常工作。例如,如果加密的单词是“goal”,那么我得到的解密单词将是“yoxl”,注意第二个和最后一个字母是正确的,但是第一个和第三个字母是不同的。谁能告诉我哪里出了问题,或者至少是方向正确
push ebp
mov ebp,esp
push edx // Push values of the edxregister onto stack
push ecx // push the characters onto the stack so that they can be returned
push eax// push the address of the ekey onto the stack
movzx eax,byte ptr [eax] // set eax to the 8- bit value in memory that eax is pointing at - eax holds the value of the key
mov edx,eax // move the ekey into the edx register
pop eax // return the address of the ekey from the stack into eax
mov byte ptr [eax],dl
pop ecx // restore the character from the stack
rol al,3
mov eax,ecx // move the address of the encrypted character into the eax register
rol al,3
xor eax,edx
pop edx // restore to original values form the stack into EDX
pop ebp
ret
我发现的第一件事是解密函数中的第二次旋转:
rol al,3
这可能是:
ror al, 3
第二件事是xor
:
xor eax,edx
可能应在第二次旋转和mov
之前移动,并更改异或寄存器:
xor ecx,edx
mov eax,ecx
ror al,3
要总结解密过程,请执行以下操作:
push ebp
mov ebp,esp
push edx
push ecx
push eax
movzx eax,byte ptr [eax]
mov edx,eax
pop eax
mov byte ptr [eax],dl
pop ecx
rol al,3
xor ecx,edx
mov eax,ecx
ror al,3
pop edx
pop ebp
ret
编辑
您的加密顺序是:rol、xor、ror
这将产生解密顺序:
rol、xor、ror
事实上,您应该能够运行加密例程两次,它将生成原始输入(纯文本)。您的代码中没有任何注释,这将大大降低人们尝试提供帮助的可能性。哦,谢谢。。我现在就把它们放在上面,你为什么要用汇编来写这个?我很确定gcc会生成更好的代码。你在加密和解密中向左旋转
ror
会将字节向右旋转。@uraf是一名计算机科学专业的学生,我们在本模块(计算机体系结构)中只使用汇编语言实际上我试过了,它会给出正确的第一个和第三个字母,而不是像前面的解决方案那样的第二个和第四个字母。解密例程应该与加密例程完全相同。这是一个简单的异或加密算法的变种。当然,除非你想在加密程序中只向左旋转。那么你只需要在解密过程中向右旋转。但是它仍然是Xor加密算法的一种变体,您还应该记住使用相同的密钥进行加密和解密(您使用1进行加密,使用3进行解密)@tloveless:我们在任何地方都看不到密钥。您所指的1
和3
是要旋转的位数。在加密例程中,它旋转1位三次。在解密例程中,它一次旋转3位。这其实是一样的。@SaniHuttunen-这就是阅读速度过快可能导致的原因-谢谢你指出,我会相应地更新我的答案。