XOR operates on one bit at a time, with these results:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
For our purposes, we'll use the Python
^ operator, which
acts on a whole byte at a time.
Characters are ASCII-encoded, like this:
A is 01000001
B is 01000010
C is 01000011
...
A whole table of ASCII values is here:
Consider A^B:
A is 01000001
B is 01000010
A^B= 00000011
That is character 3, an unprintable
end-of-text mark.
However, A^s is printable:
A is 01000001
s is 01110011
A^B= 00110010
The result is the hexadecimal value
0x32, or the numeral 2.
nano xor1
In nano, enter the code
shown below:
#!/usr/bin/python
import sys
if len(sys.argv) != 4:
print "Usage: ./xor1 infile outfile k"
print "k is a one-character XOR key"
print "For hexadecimal keys, use $'\\x01'"
exit()
f = open(str(sys.argv[1]), "rb")
g = open(str(sys.argv[2]), "a")
k = ord(sys.argv[3])
try:
byte = f.read(1)
while byte != "":
xbyte = ord(byte) ^ k
g.write(chr(xbyte))
byte = f.read(1)
finally:
f.close()
g.close()
Save the file with Ctrl+X, Y, Enter. Next, we need to make the file executable.
In a Terminal window, execute this command:
chmod a+x xor1
./xor1
You see the help message,
explaining how to use the program,
as shown below.
To create a file named plain1 with the letter A in it, execute these commands :
echo -n A > plain1
cat plain1
The "echo -n" command created a file named plain1 which contains a single letter
A, without a
carriage return at the end of the file.
The "cat plain1" command printed out the file, which appeared as a single A at the start of the next line, as shown below:
To encode the plain1 file with a key of s, execute these commands:
./xor1 plain1 cipher1 s
cat cipher1
The result is 2,
as shown below:
nano plain2
In nano, enter the code
shown below, replacing
"YOUR NAME" with your own name:
Normal English text; written by YOUR NAME
Save the file with Ctrl+X, Y, Enter. To encrypt the file using a key of x, execute these commands:
./xor1 plain2 cipher2 x
cat cipher2
The result is strange unreadable
characters,
as shown below:
Execute these commands:
./xor1 cipher2 plain2r x
cat plain2r
The file is restored to readable
text,
as shown below: