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'