基本上我有一个用asm编写的加密子例程,需要在asm中转换成解密例程。假设该程序在将其再次解密为原始字符串之前对其进行加密。
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
我在编写解密例程时遇到问题。我开始只是反转加密的每一行(推送edx更改为pop edx等),但我被告知这是不正确的,如果我想要正确解密字符串。
有人能告诉我哪些线路需要逆转解密程序吗?
如果它有帮助,这是主要的加密例程。
for (int i = 0; i < length; i++){
temp_char = OChars [i];
__asm {
push eax
push ecx
movsx ecx,temp_char
lea eax,EKey
call encrypt
mov temp_char,al
pop ecx
pop eax
}
EChars [i] = temp_char;
程序接受一个加密密钥,这是一个随机字符,然后加密到目前为止的6个字符串。
感谢任何帮助。
答案 0 :(得分:0)
因此,当事物加密时,从明文字节'p'和键字节'k'开始,在它的初始状态'k(0)',它继续:
a = -p
b = ror(a, 1)
c = b xor k(0)
k(1) = rol(k(0), 3)
d = c xor k(1)
e = rol(d, 2)
所以要扭转这一点:
d = ror(e, 2)
c = d xor k(1) // xor being its own inverse
k(0) = ror(k1, 3)
b = c xor k(0)
a = rol(b, 1)
p = -a // - being its own inverse
显然,问题在于解密以k(0)开始,并且在第一个字节想要为k(1)(对于下一个字节)之后,而不是相反,所以我们需要:
t = k(0) // temporary copy of k(0)
k(1) = rol(k(0), 3) // so same as encrytption
d = ror(e, 2)
c = d xor k(1)
b = c xor t
a = rol(b, 1)
p = -a
现在我注意到b = d xor k1 xor t
,而xor
是可交换的,所以事实上,上述内容可以在不需要t
的情况下完成。