Feistel Cipher model is a structure or a design used to develop many block ciphers such as DES. Feistel cipher may have invertible, non-invertible and self invertible components in its design. Same encryption as well as decryption algorithm is used. A separate key is used for each round. However same round keys are used for encryption as well as decryption.
Feistel cipher algorithm
- Create a list of all the Plain Text characters.
- Convert the Plain Text to Ascii and then 8-bit binary format.
- Divide the binary Plain Text string into two halves: left half (L1)and right half (R1)
- Generate a random binary keys (K1 and K2) of length equal to the half the length of the Plain Text for the two rounds.
First Round of Encryption
- a. Generate function f1 using R1 and K1 as follows:
f1= xor(R1, K1)
- b. Now the new left half(L2) and right half(R2) after round 1 are as follows:
R2= xor(f1, L1) L2=R1
Second Round of Encryption
- a. Generate function f2 using R2 and K2 as follows:
f2= xor(R2, K2)
- b. Now the new left half(L3) and right half(R3) after round 2 are as follows:
R3= xor(f2, L2) L3=R2
- Concatenation of R3 to L3 is the Cipher Text
- Same algorithm is used for decryption to retrieve the Plain Text from the Cipher Text.
Examples:
Plain Text is: Hello Cipher Text: E1!w( Retrieved Plain Text is: b'Hello' Plain Text is: Geeks Cipher Text: O;Q Retrieved Plain Text is: b'Geeks'
Python3
# Python program to demonstrate # Feistel Cipher Algorithm import binascii # Random bits key generation def rand_key(p): import random key1 = "" p = int (p) for i in range (p): temp = random.randint( 0 , 1 ) temp = str (temp) key1 = key1 + temp return (key1) # Function to implement bit exor def exor(a,b): temp = "" for i in range (n): if (a[i] = = b[i]): temp + = "0" else : temp + = "1" return temp # Defining BinarytoDecimal() function def BinaryToDecimal(binary): # Using int function to convert to # string string = int (binary, 2 ) return string # Feistel Cipher PT = "Hello" print ( "Plain Text is:" , PT) # Converting the plain text to # ASCII PT_Ascii = [ ord (x) for x in PT] # Converting the ASCII to # 8-bit binary format PT_Bin = [ format (y, '08b' ) for y in PT_Ascii] PT_Bin = "".join(PT_Bin) n = int ( len (PT_Bin) / / 2 ) L1 = PT_Bin[ 0 :n] R1 = PT_Bin[n::] m = len (R1) # Generate Key K1 for the # first round K1 = rand_key(m) # Generate Key K2 for the # second round K2 = rand_key(m) # first round of Feistel f1 = exor(R1,K1) R2 = exor(f1,L1) L2 = R1 # Second round of Feistel f2 = exor(R2,K2) R3 = exor(f2,L2) L3 = R2 # Cipher text bin_data = L3 + R3 str_data = ' ' for i in range ( 0 , len (bin_data), 7 ): # slicing the bin_data from index range [0, 6] # and storing it in temp_data temp_data = bin_data[i:i + 7 ] # passing temp_data in BinarytoDecimal() function # to get decimal value of corresponding temp_data decimal_data = BinaryToDecimal(temp_data) # Decoding the decimal value returned by # BinarytoDecimal() function, using chr() # function which return the string corresponding # character for given ASCII value, and store it # in str_data str_data = str_data + chr (decimal_data) print ( "Cipher Text:" , str_data) # Decryption L4 = L3 R4 = R3 f3 = exor(L4,K2) L5 = exor(R4,f3) R5 = L4 f4 = exor(L5,K1) L6 = exor(R5,f4) R6 = L5 PT1 = L6 + R6 PT1 = int (PT1, 2 ) RPT = binascii.unhexlify( '%x' % PT1) print ( "Retrieved Plain Text is: " , RPT) |
Output:
Plain Text is: Hello Cipher Text: E1!w( Retrieved Plain Text is: b'Hello'
Time Complexity: O(n)
Auxiliary Space: O(n)