XOR Encryption code produces wrong results
So as said, there's nothing really wrong about your encryption code, you just can't print all of those bytes.
Here's a slight rework that
- moves the allocation outside the XORCipher function (so the caller is responsible for memory management)
- adds an utility function to print byte values as well as the ASCII text
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void XORCipher(const char *data, const char *key, char *dest, int dataLen, int keyLen) {
for (int i = 0; i < dataLen; ++i) {
dest[i] = data[i] ^ key[i % keyLen];
}
}
static void print_hex(const char *header, const unsigned char *data, int length) {
int i = 0;
while(i < length) {
char asc_line[17] = {0};
printf("%s(%04x): ", header, i);
for(int j = 0; j < 16; i++, j++) {
if(i < length) {
printf("%02x ", data[i]);
asc_line[j] = (data[i] >= 32 && data[i] <= 127 ? data[i] : '.');
} else {
printf(" ");
}
}
printf("| %-16s |\n", asc_line);
}
printf("%s\n----\n", data);
}
int main(void) {
char *text = "The quick brown fox jumps over the lazy dog.";
char *key = "secret";
int dataLen = strlen((char *)text);
int keyLen = strlen((char *)key);
char *output = (char *)malloc(sizeof(char) * dataLen);
print_hex("Original text", text, dataLen);
XORCipher(text, key, output, dataLen, keyLen);
print_hex("Ciphered text", output, dataLen);
XORCipher(output, key, output, dataLen, keyLen);
print_hex("Deciphered text", output, dataLen);
}
The output is
Original text(0000): 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 | The quick brown |
Original text(0010): 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 | fox jumps over t |
Original text(0020): 68 65 20 6c 61 7a 79 20 64 6f 67 2e | he lazy dog. |
The quick brown fox jumps over the lazy dog.
----
Ciphered text(0000): 27 0d 06 52 14 01 1a 06 08 52 07 06 1c 12 0d 52 | '..R.....R.....R |
Ciphered text(0010): 03 1b 0b 45 09 07 08 04 00 45 0c 04 00 06 53 11 | ...E.....E....S. |
Ciphered text(0020): 0b 17 45 18 12 1f 1a 52 01 1b 14 4b | ..E....R...K |
'
RR
RE
----
Deciphered text(0000): 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 | The quick brown |
Deciphered text(0010): 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 | fox jumps over t |
Deciphered text(0020): 68 65 20 6c 61 7a 79 20 64 6f 67 2e | he lazy dog. |
The quick brown fox jumps over the lazy dog.
----
(Note I'm deciphering the output
back into output
– that's fine in this instance since we know the cipher function works byte by byte.)