5

ビットの排他的論理和を使用することは、私には明らかなことです。しかし、ここでは、XORは個々のキャラクターに取り組んでいます。それで、これは文字を構成するバイトが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;
}

XORされたビットは次のようになります:
1010
1100
0110

4

5 に答える 5

7

XOR には、同じデータを使用して何かを 2 回 XOR すると、元のデータが得られるという優れた特性があります。投稿したコードは、キーを使用して文字列を「暗号化」する初歩的な暗号化関数です。結果の暗号文は、同じプログラムを介して供給され、復号化できます。

于 2010-07-06T20:43:43.967 に答える
5

CおよびC++では、文字列は通常、8ビットのchar値としてメモリに格納されます。格納される値は、文字のASCII値です。

したがって、コードはASCII値をXORします。たとえば、出力の2番目の文字は次のように計算されます。

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

ASCIIの代わりにEBCDICを使用するシステムでこのコードを実行すると、異なる結果が得られる可能性があります。

于 2010-07-06T20:44:17.610 に答える
2
それで、これは文字を構成するバイトがXORされていることを意味しますか?

その通り。

これはどのように見えますか?

他のXORと同じように:)。ASCIIでは「素敵な猫」は(16進数で)

41 20 6E 69 63 65 20 63 61 74

およびABCDEFGHIJ

41 42 43 44 45 46 47 48 49 4A

したがって、各バイトを互いにXORすると、次のようになります。

00 62 2D 2D 26 23 67 2B 28 3E

、これは「\ 0b-&#g +(>」の16進表現です。つまり、そのコードを実行したときに表示される文字列です。

結果のテキストを再度XORすると、開始したテキストが返されることに注意してください。これが、XORがエンコードと暗号化で頻繁に使用される理由です。

于 2010-07-06T20:48:42.973 に答える
2

文字の xor は、2 つの文字の対応する各ビット (それぞれ 1 バイト) に対して xor 操作を実行します。

于 2010-07-06T20:43:45.553 に答える
0

これはワンタイム パッド暗号化の簡単なデモンストレーションです。ご覧のとおり、これは非常に単純であり、たまたま唯一の解読不可能な形式の暗号化でもあります。対称であり、メッセージと同じくらい大きなキーを持つため、実用的ではないことがよくありますが、それでも多くの興味深いアプリケーションがあります.. :-)

まだ慣れていない場合は、鍵と暗号文の対称性に気付くと面白いでしょう。それらを生成した後、どちらがどちらであるかの区別はありません。つまり、どちらが最初に作成され、どちらが他方と xor された平文に基づいているかということです。基本的な暗号化とは別に、これはもっともらしい否認のアプリケーションにもつながります。

于 2010-07-07T20:24:40.237 に答える