对比特使用异或是我很清楚的事情。但在这里,XOR正致力于个性化角色。那么这是否意味着构成角色的字节正在被异或?这看起来像什么?
#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;
}
我知道XORed的位看起来像这样:
1010
1100
的 0110
答案 0 :(得分:7)
XOR具有很好的属性,如果您使用相同的数据对某些东西进行两次异或,则可以获得原始属性。您发布的代码是一些基本的加密函数,它使用密钥“加密”字符串。得到的密文可以通过相同的程序进行解密。
答案 1 :(得分:5)
在C和C ++中,字符串通常以8位字符值存储在内存中,其中存储的值是字符的ASCII值。
因此,您的代码会对ASCII值进行异或。例如,输出中的第二个字符计算如下:
'B' ^ ' ' = 66 ^ 32 = 01000010 ^ 00100000 = 01100010 = 98 = 'b'
如果您在使用EBCDIC而非ASCII的系统上运行此代码,则可能会得到不同的结果。
答案 2 :(得分:2)
xor on字符对两个字符的每个对应位执行xor操作(每个字符一个字节)。
答案 3 :(得分:2)
这是否意味着构成字符的字节正在被异或?
完全。
这是什么样的?
和其他任何XOR一样:)。在ASCII中“一只漂亮的猫”是(十六进制)
41 20 6E 69 63 65 20 63 61 74
和ABCDEFGHIJ
41 42 43 44 45 46 47 48 49 4A
所以,如果你把每个字节相互异或,你得到
00 62 2D 2D 26 23 67 2B 28 3E
,这是“\ 0b - &amp; #g +(&gt;”)的十六进制表示,即运行该代码时显示的字符串。
请注意,如果您再次对结果文本进行异或,则会返回您开始使用的文本;这就是XOR经常用于编码和加密的原因。
答案 4 :(得分:0)
这是一次性填充加密的简单演示,您可以看到它非常简单,并且恰好是唯一可证明不可破解的加密形式。由于它是对称的并且具有与消息一样大的密钥,它通常不实用,但它仍然有许多有趣的应用程序..: - )
如果您还不熟悉它,有一件有趣的事情是密钥和密文之间的对称性。在生成它们之后,没有区别哪个是哪一个,即哪个是首先创建的,哪个是基于与另一个xor'd的明文。除了基本加密之外,这也会导致应用程序看似合理。