以下程序编译和工作 但是我无法弄清楚要为解密部分写什么。
有人可以帮我写相应的decrypt_chars()
例程吗?
void encrypt_chars(int length, char EKey)
{
char temp_char; // char temporary store
for (int i = 0; i < length; i++) // encrypt characters one at a time
{
temp_char = OChars[i];
__asm {
push eax // save register values on stack to be safe
push ecx //
movzx ecx, temp_char //
lea eax, EKey
call encrypt // encrypt the character
mov temp_char, al
pop ecx // restore original register values from stack
pop eax //
}
EChars[i] = temp_char; // Store encrypted char in the encrypted chars array
}
return;
// --- Start of Assembly code
__asm {
// Inputs: register EAX = 32-bit address of Ekey,
//ECX = the character to be encrypted (in the low 8-bit field, CL).
// Output: register EAX = the encrypted value of the source character (in the low 8-bit field, AL).
encrypt5: push eax
mov al, byte ptr[eax]
push ecx
and eax, 0x7C
ror eax, 1
ror eax, 1
inc eax
mov edx, eax
pop ecx
pop eax
mov byte ptr[eax], dl
xor edx, ecx
mov eax, edx
rol al, 1
ret
encrypt:
mov eax, ecx // get character
inc eax
ret
}
//--- End of Assembly code
}
// end of encrypt_chars function
void decrypt_chars(int length, char EKey)
{
/* needs to be written */
return;
}
答案 0 :(得分:0)
现在看来,似乎解密几乎是微不足道的。虽然encrypt5
代码试图做更精细的事情,但这里似乎实际使用的所有内容都是encrypt
例程,它只是增加每个输入(完全忽略键),所以{{1} }变为A
,B
变为B
,依此类推。
因此,解密例程同样重要:
C
如果你真的坚持用汇编语言这样做,那么核心就会是这样的:
void decrypt(char *data, int length) {
for (int i=0; i<length; i++)
--data[i];
}
然后你会对加密感兴趣,并为输入字符串中的每个字符调用一次。
如果/如果加密被修复以执行某些操作而不仅仅是递增每个输入字符,则需要更新解密以匹配。当然,正如它现在所说的那样,加密并不值得加密#34;完全 - 因为它没有密钥,它提供了精确的零安全性。