// Andrew Taylor - andrewt@unsw.edu.au // 08/06/2020 // copy stdin to stdout xor'ing each byte with value given as argument /*``` $ echo Hello Andrew|xor 42 bOFFE kDNXO] $ echo Hello Andrew|xor 42|cat -A bOFFE$ kDNXO] $ $ echo Hello |xor 42 bOFFE $ echo -n 'bOFFE '|xor 42 Hello $ echo Hello|xor 123|xor 123 Hello $ ```*/ #include #include // x = 5 0000 0101 5 (x is plaintext) // mask = 7 0000 0111 XOR ENCRYPT (mask is secret/key) // ---------- // 0000 0010 4 (xor to get cipher text) // 0000 0111 XOR DECRYPT // ----------- // 0000 0101 5 (get back original plaintext) // Try value of 20 int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } int xor_value = strtol(argv[1], NULL, 0); if (xor_value < 0 || xor_value > 255) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } int c; while ((c = getchar()) != EOF) { // ^ | 0 1 // ----|----- // 0 | 0 1 // 1 | 1 0 int xor_c = c ^ xor_value; putchar(xor_c); } return 0; }