1

XOR暗号化を使用するときに特定の文字が空白になる原因は何ですか?さらに、復号化するときにこれをどのように補正できますか?

例えば:

....
void basic_encrypt(char *to_encrypt) {
    char c;
    while (*to_encrypt) {
        *to_encrypt = *to_encrypt ^ 20;
        to_encrypt++;
    }
}

文字に対して「nothing」を返しkます。明らかに、文字の減衰は復号化に問題があります。

これはビット演算子が原因だと思いますが、バイナリはあまり得意ではないので、誰か説明してもらえないかと思いました。

kこの場合、要素をスペースのないASCII文字に変換していますか?これは、y <x <z演算子を選択することで補うことができますか?ここで、xは演算子です。

最後に、それが補償されていない場合、推測とチェック以外に空白を埋めるための現実的な復号化戦略はありますか?

4

3 に答える 3

6

'k'ASCII値を持っています107 = 0x6B20です0x14、そう

'k' ^ 20 == 0x7F == 127

文字セットがASCII互換の場合。127\DELASCIIであり、印刷できない文字であるため、印刷しても表示されません。

于 2013-01-09T21:12:29.213 に答える
3

どちらが起こっているかを理解するには、バイトと文字の違いを知る必要があります。一方では、Ccharタイプがあります。これは、文字ではなく、単にバイトの表現です。

昔は、各文字は文字エンコードテーブルまたはコードページの1バイトまたはオクテット値にマップされていました。現在、UTF-8などの特定の文字に対してより多くのバイトを使用するエンコーディングや、UTF-16などの常に複数のバイトを使用するエンコーディングがあります。最後の2つはUnicodeエンコーディングです。つまり、各文字には特定の数値があり、エンコーディングはこの数値をバイトにエンコードするために使用されます。

多くのコンピュータは、ISO / IEC 8859-1またはLatin-1のバイトを解釈し、Windows-1252によって拡張されることもあります。これらのコードページには、制御文字、または単に使用されないバイト値用の穴があります。現在、これらの値がどのように処理されるかはランタイムシステムによって異なります。Javaはデフォルト?で、欠落している文字の代わりに文字を置き換えます。他のランタイムは、単に値を削除するか、もちろん、制御コードを実行します。一部の端末では、ESC制御コードを使用して色を設定したり、別のコードページに切り替えたり(画面を混乱させる)する場合があります。

これが、暗号文を16進数やBase64などの別のエンコーディングに変換する必要がある理由です。これらのエンコーディングは、結果が読み取り可能なテキストであることを確認する必要があります。これにより、暗号文が処理されます。プレーンテキストにも文字セットを選択する必要があります。たとえば、暗号化の前にASCIIまたはUTF-8エンコーディングを実行するだけです。

于 2013-01-09T21:23:07.900 に答える
1

同じxorキーを使用してre-xorを実行すると元の値が取得されるため、暗号化からゼロ値を取得することは重要ではありません。

value == value
value XOR value == 0 [encryption]
( value XOR value ) XOR value == value [decryption]

ゼロで終了する文字列メカニズムを使用している場合、「文字の劣化」を防ぐための2つの主要な戦略があります。

  • 暗号化する前に文字列の長さを保存し、復号化時に少なくともその数の文字を復号化するようにしてください
  • 文字をデコードした、ゼロ文字を確認してください
于 2013-01-09T21:11:49.000 に答える