Cifrado de Feistel

El modelo de cifrado de Feistel es una estructura o un diseño utilizado para desarrollar muchos cifrados de bloque como DES. El cifrado de Feistel puede tener componentes invertibles, no invertibles y autoinvertibles en su diseño. Se utiliza el mismo algoritmo de cifrado y descifrado. Se utiliza una clave separada para cada ronda. Sin embargo, las mismas claves redondas se utilizan tanto para el cifrado como para el descifrado. 
 

Algoritmo de cifrado de Feistel

  • Cree una lista de todos los caracteres de texto sin formato. 
     
  • Convierta el texto sin formato a ASCII y luego a formato binario de 8 bits. 
     
  • Divida la string binaria de texto sin formato en dos mitades: la mitad izquierda (L1) y la mitad derecha (R1) 
     
  • Genere claves binarias aleatorias (K1 y K2) de longitud igual a la mitad de la longitud del texto sin formato para las dos rondas. 
     

Primera ronda de cifrado 

  • una. Genere la función f1 usando R1 y K1 de la siguiente manera:
f1= xor(R1, K1)
  • b. Ahora, la nueva mitad izquierda (L2) y la mitad derecha (R2) después de la ronda 1 son las siguientes:
R2= xor(f1, L1)
L2=R1

Segunda ronda de cifrado 

  • una. Genere la función f2 usando R2 y K2 de la siguiente manera: 
     
f2= xor(R2, K2)
  • b. Ahora, la nueva mitad izquierda (L3) y la mitad derecha (R3) después de la ronda 2 son las siguientes:
R3= xor(f2, L2)
L3=R2
  • La concatenación de R3 a L3 es el texto cifrado
  • El mismo algoritmo se utiliza para el descifrado para recuperar el texto sin formato del texto cifrado.

Ejemplos: 

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)

Producción:

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

Publicación traducida automáticamente

Artículo escrito por AmiMunshi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *