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?
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
.