XOR
最简单的一种加密形式
相同位的结果为0,不同的为1;
知二求一
加密和还原是一样的,可以将还原看成另类的xor加密
xor加密
原理:首先将字符、数据转为bit,然后通过相同位为0不同位为1的规则得到结果
这里将xor分为两类(给定字符串flag{hello}
)
- 自身xor
自身xor,简单来讲就是以自己为a,以自己其他的数据作为b,进行xor,得到结果ab
- 非自身xor
非自身xor,简单来讲就是以自己为a,以其他的数据作为b,进行xor,得到结果ab
ps:这里要注意xor的存储方式
- 以原来的空间作为结果的存储空间(这会使得原来的数据会被抹掉)
- 自身xor
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char ida_chars[] = "flag{hello}";
for (int i = 0; i < strlen(ida_chars)-1; ++i) {
ida_chars[i] ^= ida_chars[i+1];
}
return 0;
}
//测试代码
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char ida_chars[] = "flag{hello}";
int len = strlen(ida_chars);
printf("原始的数据\n");
for (int i = 0; i < len; ++i) {
printf("%d\t",ida_chars[i]);
}
for (int i = 0; i < len-1; ++i) {
ida_chars[i] ^= ida_chars[i+1];
}
printf("\n");
printf("自身xor后的数据\n");
for (int i = 0; i < len; ++i) {
printf("%d\t",ida_chars[i]);
}
return 0;
}
能看到原来的空间的值已经被修改了,但是并没有完全被修改,留了最后一个,一般这样的可以利用最后一个从后往前推还原出原始数据
过程如图:
- 非自身xor
一般来说会给定一个数据、一个字符或者一个字符串来作为key值,用这个值来对所给的字符串进行xor
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char ida_chars[] = "flag{hello}";
int key = 33;
for (int i = 0; i < strlen(ida_chars); ++i) {
ida_chars[i] ^= key;
}
return 0;
}
//测试代码
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char ida_chars[] = "flag{hello}";
int len = strlen(ida_chars);
printf("原始的数据\n");
for (int i = 0; i < len; ++i) {
printf("%d\t",ida_chars[i]);
}
int key = 33;
for (int i = 0; i < strlen(ida_chars); ++i) {
ida_chars[i] ^= key;
}
printf("\n");
printf("非自身xor后的数据\n");
for (int i = 0; i < len; ++i) {
printf("%d\t",ida_chars[i]);
}
return 0;
}
- 以一个新的空间作为结果的存储空间
这个就简单许多,就是新开辟一个空间,将结果存放进去 ,不占用原有的空间
还原xor后的数据
只要知道加密数据中的其中一个,和结果,那么就能还原出另一个加密数据