这是加密字符的加密例程:
任何人都可以对解密程序有所启发吗?
编辑(见评论):
答案 0 :(得分:1)
这是我们可以解密的第一个块:
xor eax,edx
xor eax,ecx
rol al,1
这是因为这些值来自堆栈。这是可逆的,如:
ror al,1
xor eax, ecx (eax = the one we had in the end)
xor eax, edx
然后edx = eax(mov edx,eax)。现在:
dec eax
rol eax, 1
rol eax, 1
并且最后一个AND无法撤消,因为:
? AND 0 = 0
? AND 1 = 1 => ? = 1
? AND 1 = 0 => ? = 0
?除非没有,否则无法识别? AND 0 = 0 组合。
答案 1 :(得分:0)
让我们看看: 为了解密消息,我们想要反转加密过程,所以让我们从方法的最后开始:
转型的最后一部分是rol al, 1
。我们可以将其反转为ror al, 1
。
其余的加密包括两个xors,一个消息和一个修改过的密钥,一个具有立即结果和原始密钥。由于xor是自反转的,我们可以通过使用原始密钥对加密的消息进行一次修改以及使用修改的密钥(使用相同的密钥修改函数)进行一次修改来反转此操作。
总而言之,应该反转加密:
decrypt: ror cl,1 //reverse rol al, 1
xor ecx, eax //reverse xor message, original key
and eax,0x3C //calculate modified key
ror eax,1
ror eax,1
inc eax //end calculate modified key
xor eax, ecx //reverse xor message modified key
ret
答案 2 :(得分:0)
如果没有ROL
,加密解密也可以用于解密。
假设加密字符在ecx
中,而密钥在eax
中,则只需要进行少量修改:
decrypt5:
push eax
push ecx
此部分从edx
的输入键生成eax
中的内部密钥:
and eax,0x3C
ror eax,1
ror eax,1
inc eax
mov edx,eax
将输入字符从ecx
弹出到eax
:
pop eax
撤消ROL AL,1
:
ror al,1
撤消异或。 XOR是一个对合,也就是它自己的逆。 它也是可交换的,所以顺序并不重要:
xor eax,edx
将输入键从eax
弹出到ecx
和XOR:
pop ecx
xor eax,ecx
ret
我希望是正确的,我的x86组件相当生锈。
请注意,调用此加密有点紧张。 它太弱了我宁愿称之为混淆。