发布
2011 年 3 月 13 日 (上次更新:2011 年 3 月 13 日)

简单 XOR 加密

评分:3.9/5 (210 票)
*****
好了,入门级的加密课程

计算机上的所有内容都存储为二进制数据,形式为字节(8 位,或单个 1 或 0)

二进制数据可以使用基于一种称为异或 (xor) 或 exclusive or 的布尔运算的“密钥”轻松“加密”。
当我们用另一个位来异或一个单一位(1 或 0)时

如果 1 位为真,而 1 位为假,则返回真,否则返回假;
所以

1 异或 1 = 0
1 异或 0 = 1
0 异或 1 = 1
0 异或 0 = 0

现在,这种方法有用的一个原因是,如果我们取新位并使用相同的密钥(第二位)对其进行异或,结果将始终是第一位。
所以

1 异或 1 异或 1 = 1;
1 异或 0 异或 0 = 1;


当然,在单个位上它不会有太大作用,但是当您进入更高的内存级别时,这是一种相当简单且(有时)有效的(参见文章后面)加密方法。

现在,当我说所有内容都存储为二进制数据时,这也意味着字符串,单个 char 存储为 ascii 或 unicode(或其他一些协议,但我只见过这两个)值。

例如

字母 'h' 在 ascii 中 = 104
字母 'i' 在 ascii 中 = 105

将整数转换为二进制数有点困难,但可以做到。
当您查看二进制数时,您可以反向读取它并添加每一位的值,如下所示

2x 25 24 23 22 21 20
所以二进制数
01110011

1
2
0    1    1    1   0   0   1   1 
0 + 64 + 32 + 16 + 0 + 0 + 2 + 1


是 115 或 's'

现在一切都很好,您可以给您的朋友发送小纸条,没有人能看懂您在说什么,但当然您也可以直接写二进制的东西,它会执行相同的操作 =)

在 c++ 中,^ 运算符是异或运算符。
如果我有一个我想加密的字符串,我可以这样做

1
2
3
4
5
6
7
8
9
10
 string toEncrypt = "fail";
 char keyToEncrypt = 's'; //remember 115 in ascii

 for (int temp = 0; temp < toEncrypt.size(); temp++)
   toEncrypt[temp] ^= keyToEncrypt;
 cout << "nThe encrypted data = " << toEncrypt;

 for (int temp = 0; temp < toEncrypt.size(); temp++)
   toEncrypt[temp] ^= keyToEncrypt; //notice we're using the exact same key, to unencrypt the data.
 cout << "nThe unencrypted data = " << toEncrypt;


当然,这一切都很好,但是对于任何为其数据使用简单密钥的人来说,这里有一个练习,如果有人可以访问您的程序。并且他们可以加密他们自己的一些数据,并且可以访问该加密的输出,他们可以得到您的密钥。示例

1
2
3
4
5
6
7
8
9
10
 char original = "f";
 char key = "s";
 char end;
 char getKey;

 end = original ^ key;

 // now here's the kicker

 getKey = original ^ end;


因此,您必须变得狡猾,一种更安全地加密和解密数据的 reeeeeaaaaly 简单的方法可能是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 string original = "super flying monkeys are aweseome, aren't they?";
 cout << "Original data = " << original;
 string encrypted = "";
 string unencrypt = "";
 char key = 'x';

 for (int temp = 0; temp < original.size(); temp++){
  encrypted += original[temp] ^ (int(key) + temp) % 255;
 }
 cout << "nEncrypted data = " << encrypted;

 for (int temp = 0; temp < original.size(); temp++){
  unencrypted += encrypted[temp] ^ (int(key) + temp) % 255;
 }
 cout << "nUnencrypted data = " << unencrypt;


当然,您应该做一些简单的递增之外的事情,因为这很容易被嗅探到。

但是你明白了,一个简单的加密课程!