异或加密算法

异或加密是通过使用布尔代数中的异或函数(XOR)实现的,XOR是一个二元运算符(即有两个参数,类似加号),按其名称“异或”容易推断两个参数中有且仅有一个为真(即两参数相异)时,结果返回真,真值表如下:

A B A XOR B
T T F
T F T
F T T
F F F

异或加密背后的原理是如果不知道两个参数的初值,就不可能进行逆向操作,例如,如果进行异或运算的两个变量值未知,就无法从结果推断两变量的值;如果A异或B返回真,你也无从知晓是A真B假还是A假B真;进一步说,就算结果返回假,也仍然无法确定两个都真还是都假。

但是,如果你之道了A或者B的初值,异或操作就是完全可逆的(不同于逻辑与、逻辑或)。例如,A XOR TRUE为真,则A假;A XOR TRUE为假,则A为真。异或加密的原则就是如果同时拥有加密的字符串和加密密钥,就可以正确解密;如果没有密钥的话,唯一的破解方法就是制作完全随机的密钥并挨个尝试,直到解密程序的输出是可读文本或其他类似的内容。加密密钥越长,就越难破解。

在实际的加密工程中,异或加密的用法是先得到加密密钥,然后对连续文件片段重复应用密钥并储存结果。输出将相当于一个完全随机的程序,因为加密密钥是随机生成的。一旦有另一个人有访问密钥的权限,那这个人就能够破解文件。但是如果得不到密钥,那么解密文件几乎是不可能,密钥的长度每增加一位,通过暴力方法破解文件所需要的尝试次数都会翻倍。

C++中使用^进行位级异或操作,如果你有一个单字节的密钥,那么加密单个字符可以使用char x=x^key,如果你要使用更长的密钥加密一串字符,则可以使用类似下面的代码:

#include <iostream.h>
int main()
{
  char string[11]="A nice cat";
  char key[11]="ABCDEFGHIJ";
  for(int x=0; x<10; x++)
  {
    string[x]=string[x]^key[x];
    cout<<string[x];
  }
  return 0;
}

程序将使用^位操作符对字符串中的每个字符与密钥中的字符进行异或运算,从而实现加密。