Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I bitwise XOR two C char arrays?

I feel silly for not being able to figure this out, but I am lost. I am trying to XOR two C strings.

#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;
}

My output is:

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

one^two: 

Why doesn't the xor array read as anything?

like image 573
Matthew Darnell Avatar asked Jan 13 '15 02:01

Matthew Darnell


Video Answer


2 Answers

Once you are dealing with XOR, you are dealing with binary bytes that might not be printable ASCII characters.

And when you XOR the same characters with each other, you get a 0. So 'P' ^ 'P' will be 0. That's a NUL byte and it terminates the string. If you try to print with printf() you get nothing; printf() considers the string to be a terminated length-0 string.

Also, you should simply assign the XOR result into your target buffer with = rather than using ^= as your program did.

Here's my version of your program, and my output:

#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;
}

Output:

PlainText One: PlainOne
PlainText Two: PlainTwo

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

Notice how the first five bytes are all 00 because Plain is XORed with Plain.

like image 82
steveha Avatar answered Sep 28 '22 05:09

steveha


Well "Plain" xor "Plain" == 00000, were 0 is the terminator char. C strings print up to the terminator, which means it prints nothing.

like image 22
naasking Avatar answered Sep 28 '22 04:09

naasking