Skip to content
Related Articles
Open in App
Not now

Related Articles

Feistel Cipher

Improve Article
Save Article
  • Difficulty Level : Medium
  • Last Updated : 24 Feb, 2022
Improve Article
Save Article

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)

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)
  • Concatenation of R3 to L3 is the Cipher Text
  • Same algorithm is used for decryption to retrieve the Plain Text from the Cipher Text.


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'



# 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
# Function to implement bit exor
def exor(a,b):
    temp = ""
    for i in range(n):
        if (a[i] == b[i]):
            temp += "0"
            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
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)


Plain Text is: Hello
Cipher Text:  E1!w(
Retrieved Plain Text is:  b'Hello'

My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!