5

我很清楚在位上使用异或。但在这里,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

4

5 回答 5

7

XOR 有一个很好的特性,如果你使用相同的数据对某事物进行两次 XOR,你将获得原始数据。您发布的代码是一些基本的加密功能,它使用密钥“加密”字符串。生成的密文可以通过相同的程序进行解密。

于 2010-07-06T20:43:43.967 回答
5

在 C 和 C++ 中,字符串通常作为 8 位字符值存储在内存中,其中存储的值是字符的ASCII值。

因此,您的代码对 ASCII 值进行异或运算。例如,输出中的第二个字符计算如下:

  'B' ^ ' '
= 66 ^ 32
= 01000010 ^ 00100000
= 01100010
= 98
='b'

如果您在使用EBCDIC而不是 ASCII的系统上运行此代码,您可能会得到不同的结果。

于 2010-07-06T20:44:17.610 回答
2

字符上的异或对两个字符的每个对应位(每个一个字节)执行异或操作。

于 2010-07-06T20:43:45.553 回答
2
那么这是否意味着构成字符的字节正在被异或?

确切地。

这看起来像什么?

与任何其他异或 :) 一样。在 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--&#g+(>”的十六进制表示,即运行该代码时显示的字符串。

请注意,如果您再次对结果文本进行异或运算,您将得到开始时的文本;这就是 XOR 经常用于编码和加密的原因。

于 2010-07-06T20:48:42.973 回答
0

这是一次性密码加密的简单演示,如您所见,它非常简单,并且恰好是唯一可证明不可破解的加密形式。由于它是对称的并且具有与消息一样大的密钥,因此通常不实用,但它仍然有许多有趣的应用程序.. :-)

如果您还不熟悉它,需要注意的一件有趣的事情是密钥和密文之间的对称性。在生成它们之后,没有区分哪个是哪个,即哪个是首先创建的,哪个是基于与另一个异或的明文。除了基本加密之外,这还导致应用程序具有合理的可否认性。

于 2010-07-07T20:24:40.237 回答