我一直在尝试一种简单的基于XOR的文本混淆算法.据说,当算法在一系列中运行两次时,我应该回到原始输入 - 但在我的实现中,有时只会发生.这是我的代码,带有一些随机文本来演示问题:
#include <stdio.h>
void obfuscate(char *text) {
char i = 0, p = 0;
while (text[i] != 0) {
text[i] = (text[i] ^ (char)0x41 ^ p) + 0xfe;
p = i++;
}
}
int main(int argc, char **argv) {
char text[] = "Letpy,Mprm` Nssl'w$:0==!";
printf("%s\n", text);
obfuscate(text);
printf("%s\n", text);
obfuscate(text);
printf("%s\n", text);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我该如何修复这个算法,以确保它自己的反转?有什么建议可以提高混淆程度吗?
我在这里看到两个问题:
操作+ 0xfe不是它自己的逆.如果删除它并仅保留XOR,则每个字节将按预期还原为其原始值.
一个更微妙的问题:加密文本可能会创建一个零字节,这将截断文本,因为您使用以null结尾的字符串.最好的解决方案可能是单独存储文本长度而不是空终止加密文本.