好了,入门级的加密课程
计算机上的所有内容都存储为二进制数据,形式为字节(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
将整数转换为二进制数有点困难,但可以做到。
当您查看二进制数时,您可以反向读取它并添加每一位的值,如下所示
2
x 2
5 2
4 2
3 2
2 2
1 2
0所以二进制数
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;
|
当然,您应该做一些简单的递增之外的事情,因为这很容易被嗅探到。
但是你明白了,一个简单的加密课程!