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.
plaintext = "HELLO"
key = 3
ciphertext = ""
for char in plaintext:
enc_num = ord(char) ^ key
enc_char = chr(enc_num)
print(char, "->", enc_char)
ciphertext += enc_char
print(plaintext, key, ciphertext.encode().hex(), ciphertext)
Run the program. It shows how each character
is encoded. The output is readable in this
case, but often it isn't, so printing
it in hex format is best.
plaintext = "KFOOL"
key = 3
ciphertext = ""
for char in plaintext:
enc_num = ord(char) ^ key
enc_char = chr(enc_num)
# print(char, "->", enc_char)
ciphertext += enc_char
print(plaintext, key, ciphertext.encode().hex(), ciphertext)
Run the program.
As shown below, encrypting ciphertext
again with the same key reverses
the process, returning the
original plaintext.
Flag VP 310.1: Encrypt Text (5 pts)
Encrypt this text with a key of 7:The flag is the ciphertext, as a five-letter word.
WALDO
Flag VP 310.2: Decrypt Text With the Key (5 pts)
Decrypt this text with a key of 19:The flag is the ciphertext, as a five-letter word.
\QUF@PRGVW
Flag VP 310.3: Decrypt Text Without the Key (10 pts)
Decrypt this ciphertext, which is expressed in hexadecimal encoding:The key is between 0 and 255.
c39bc3b1c3bcc3bac2a7c2bdc39fc38fc388c389c398c39bc392c38fc39ec398The flag is in the plaintext, as a readable word.
Flag VP 310.4: Decrypt an Image Without the Key (15 pts)
Download this file:VP310-4Decrypt it to find a PNG image. View that image to see the flag.The key is a single byte between 0 and 255.
Flag VP 310.5: Two-Byte Key (15 pts)
Download this file:VP310-5Decrypt it to find a JPEG image. View that image to see the flag.The key is two bytes long, so encryption takes place sixteen bits at a time.
Flag VP 310.6: Four-Byte Key (15 pts)
Download this file:VP310-6Decrypt it to find a ZIP archive. The flag is inside it.The key is four bytes long, so encryption takes place 32 bits at a time.