如何恢复加密过程
How to revert an Encryption process
作为一项任务,我得到了一些汇编代码,这些代码从用户那里获取输入(加密密钥),然后是一串字母数字字符,然后通过简单地打乱字节顺序来加密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
}
你没有post,但由于这是第三次有人请求
这 exact 种要解决的练习,我假设 EAX
持有一个指针
到当前键字符和 ECX
保存当前消息字符(即要
加密)。
1。反向引擎算法
这是一个非常简单的无状态算法,我对每个有用的指令都做了注释。
我假设您了解汇编,如果不了解,您可以在线学习教程。
这个逆向工程没有什么要补充的了,代码是等价的(甚至
由于垂直拆分为简单的操作而更加清晰)到高层
简单的源代码
;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
表示密钥字符。
2。反转函数
您必须知道所使用的每个函数的反函数,这很简单,但这是列表
f | f^-1
-------+-------
XOR | XOR
NEG | NEG
ROL | ROR
ROR | ROL
然后你从外函数开始向内函数,记住你的目标是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))
.
3。在汇编中实现
您可以在汇编中轻松编写上述表达式。
警告
仔细检查上面的陈述,我没有运行代码也没有做任何测试。
您应该检查细微的更正,使用您的批判意识,不要复制粘贴任何公式。
如果你盲目相信别人的代码,那么你考不及格就看你的了。
请问这个练习的背景是什么?这是您的汇编编程课程的作业吗?
作为一项任务,我得到了一些汇编代码,这些代码从用户那里获取输入(加密密钥),然后是一串字母数字字符,然后通过简单地打乱字节顺序来加密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
}
你没有post,但由于这是第三次有人请求
这 exact 种要解决的练习,我假设 EAX
持有一个指针
到当前键字符和 ECX
保存当前消息字符(即要
加密)。
1。反向引擎算法
这是一个非常简单的无状态算法,我对每个有用的指令都做了注释。
我假设您了解汇编,如果不了解,您可以在线学习教程。
这个逆向工程没有什么要补充的了,代码是等价的(甚至
由于垂直拆分为简单的操作而更加清晰)到高层
简单的源代码
;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
表示密钥字符。
2。反转函数
您必须知道所使用的每个函数的反函数,这很简单,但这是列表
f | f^-1
-------+-------
XOR | XOR
NEG | NEG
ROL | ROR
ROR | ROL
然后你从外函数开始向内函数,记住你的目标是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))
.
3。在汇编中实现
您可以在汇编中轻松编写上述表达式。
警告
仔细检查上面的陈述,我没有运行代码也没有做任何测试。
您应该检查细微的更正,使用您的批判意识,不要复制粘贴任何公式。
如果你盲目相信别人的代码,那么你考不及格就看你的了。
请问这个练习的背景是什么?这是您的汇编编程课程的作业吗?