Feistel Cipher - GeeksforGeeks

24 Feb, 2022
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.  
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 generationdef 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 exordef exor(a,b):         temp = ""         for i in range(n):                 if (a[i] == b[i]):            temp += "0"                     else:            temp += "1"                 return temp # Defining BinarytoDecimal() functiondef BinaryToDecimal(binary):           # Using int function to convert to    # string       string = int(binary, 2)           return string # Feistel CipherPT = "Hello"print("Plain Text is:", PT) # Converting the plain text to# ASCIIPT_Ascii = [ord(x) for x in PT] # Converting the ASCII to# 8-bit binary formatPT_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 roundK1= rand_key(m)  # Generate Key K2 for the# second roundK2= rand_key(m)  # first round of Feistelf1 = exor(R1,K1)R2 = exor(f1,L1)L2 = R1  # Second round of Feistelf2 = exor(R2,K2)R3 = exor(f2,L2)L3 = R2  # Cipher textbin_data = L3 + R3str_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) # DecryptionL4 = L3R4 = R3  f3 = exor(L4,K2)L5 = exor(R4,f3)R5 = L4  f4 = exor(L5,K1)L6 = exor(R5,f4)R6 = L5PT1 = 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'
Akanksha_Rai
surindertarika1234
malikhushbu6
cryptography
python-utility
Python
cryptography
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Python Dictionary
How to Install PIP on Windows ?
Enumerate() in Python
Different ways to create Pandas Dataframe
Python String | replace()
*args and **kwargs in Python
Reading and Writing to text files in Python
Create a Pandas DataFrame from Lists
Convert integer to string in Python
Check if element exists in list in Python