异或,逻辑运算,运算规则为:T^F=T, T^T = F, F^F = F。并且有 a = b^c, b = a^c。
因此可以简单的利用该方法加密解密。我使用了如下的程序:
#include <stdio.h>
const char c = 0x49;
int main(int argc, char *argv[])
{
FILE *f = NULL;
FILE *p = NULL;
char a = 0;
char b = 0;
f = fopen("text.txt", "r");
if (NULL == f)
{
printf("Error 1./n");
exit(0);
}
p = fopen("text1.txt", "w");
if (NULL == p)
{
fclose(f);
printf("Error 2./n");
exit(0);
}
while (fscanf(f, "%c", &a) != EOF)
{
b = c ^ a;
printf("%c -> %02X/n", a, b);
fprintf(p, "%c", b);
}
fclose(f);
fclose(p);
return 0;
}
这段程序使用的text.txt 仅为拥有14个字符“ABCDEFGHIJKLMN”的文件,运行过程中屏幕输出为:
A -> 08
B -> 0B
C -> 0A
D -> 0D
E -> 0C
F -> 0F
G -> 0E
H -> 01
I -> 00
J -> 03
K -> 02
L -> 05
M -> 04
N -> 07
这些都没有问题,但是输出的text1.txt有15个字节,使用UltraEdit查看16静止会发现在B之后C之前(即0B和0A之间出现了一个0D),虽然我知道Windows平台下 /r/n经常成对出现,但是我没有使用你你就不要出来嘛。
然后将上述程序修改一下,将text1中的内容再异或一次输出到text2中去,屏幕输出结果为:
08 -> A
0B -> B
0A -> C
0D -> D
0C -> E
0F -> F
0E -> G
01 -> H
00 -> I
03 -> J
02 -> K
05 -> L
04 -> M
07 -> N
可以看到并没有那个0D(本来应该是第三个)存在,并且text2.txt只有14个字节。
我没有明白这是什么原因,很神奇啊。
我在Ubuntu9.04 下边实验了一下,text文件就是15个字节,第一次运行的时候可以看到最后一个字符不是N而是/n(0A),因此生成的text1也有15bytes,从text1到text2也是,最后一个字节又被转换为0A了。这三个文件都是15字节。这点不明白。