#The magic of a Feistel cipher is the Exclusive OR (XOR) function.
#When you XOR something with the same thing again, it undoes it:
pin = {1,2,3}
block_key = {3,4,5}
encrypted_pin = pin.symmetric_difference(block_key) #XOR
print(encrypted_pin) #{1, 2, 4, 5}
decrypted_pin = encrypted_pin.symmetric_difference(block_key) #XOR
print(decrypted_pin) #{1, 2, 3}
#By using XOR, an encryption function can still be one-way
#(e.g. hash function). The Feistel network can still decrypt.
########## DATA ENCRYPYTION STANDARD:
#On the exam, a Feistel network can be described as a "very
#similar or identical set of iterative structural processes
#to encrypt or decrypt the same block of data".
# Feistel network (DES):
#1) get a block of data
#2) split the block into two sides
#3) use one side to permute the other side
#4) swap the sides
#5) repeat
# HOW IS FEISTEL (DES) DIFFERENT TO AES?
# --------------------------------------
# AES is a 'substitution-permutation' network which is different
# in structure. The AES structure uses a lookup table of bytes...
# it still repeats this through multiple rounds, but uses a jumbling
# of bytes. Both AES and DES can be reversed. AES could be considered
# a "random"-permutation (you need the key).

Py2.x