web-dev-qa-db-ja.com

どうすればビット単位でXOR 2つのC char配列を使用できますか?

これがわからないのはばかげていますが、迷っています。 XOR 2つのC文字列を作成しようとしています。

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
int main()
{
    char plainone[16]; 
    char plaintwo[16];
    char xor[17];
    strcpy(plainone, "PlainOne");
    strcpy(plaintwo, "PlainTwo");
    int i=0;
    for(i=0; i<strlen(plainone);i++)
        xor[i] ^= (char)(plainone[i] ^ plaintwo[i]);
    printf("PlainText One: %s\nPlainText Two: %s\n\none^two: %s\n", plainone, plaintwo, xor);
    return 0;
}

私の出力は:

$ ./a.out 
PlainText One: PlainOne
PlainText Two: PlainTwo

one^two: 

Xor配列が何としても読み取られないのはなぜですか?

10
Matthew Darnell

XORを処理すると、印刷できない可能性があるバイナリバイトを処理しますASCII文字。

そして、XOR互いに同じ文字である場合、0を取得します。したがって、_'P' ^ 'P'_は0になります。これはNULバイトであり、文字列を終了します。印刷しようとすると、 printf()では何も得られません; printf()は文字列を終端された長さ0の文字列と見なします。

また、プログラムのように_=_を使用するのではなく、単純にXOR結果を_^=_を使用してターゲットバッファーに割り当てる必要があります。

ここにあなたのプログラムの私のバージョンと私の出力があります:

_#include <stdio.h>
#include <memory.h>
#include <stdlib.h>

#define LENGTH 16
int main()
{
    char const plainone[LENGTH] = "PlainOne";
    char const plaintwo[LENGTH] = "PlainTwo";
    char xor[LENGTH];
    int i;

    for(i=0; i<LENGTH; ++i)
        xor[i] = (char)(plainone[i] ^ plaintwo[i]);
    printf("PlainText One: %s\nPlainText Two: %s\n\none^two: ", plainone, plaintwo);
    for(i=0; i<LENGTH; ++i)
        printf("%02X ", xor[i]);
    printf("\n");
    return 0;
}
_

出力:

_PlainText One: PlainOne
PlainText Two: PlainTwo

one^two: 00 00 00 00 00 1B 19 0A 00 00 00 00 00 00 00 00
_

PlainPlainとXORされるため、最初の5バイトがすべて_00_であることに注意してください。

12
steveha

まあ「プレーン」xor「プレーン」== 00000、0はターミネーター文字です。 C文字列はターミネータまで印刷されます。つまり、何も印刷されません。

2
naasking