El cifrado de Bacon o el cifrado baconiano es un método de esteganografía (un método para ocultar un mensaje secreto en lugar de solo un cifrado) ideado por Francis Bacon en 1605. Un mensaje se oculta en la presentación del texto, en lugar de su contenido. El cifrado baconiano es un cifrado por sustitución en el que cada letra se reemplaza por una secuencia de 5 caracteres. En el cifrado original, estas eran secuencias de ‘A’s y ‘B’s, por ejemplo, la letra ‘D’ fue reemplazada por ‘aaabb’, la letra ‘O’ fue reemplazada por ‘abbab’, etc.
Cada letra se asigna a una string de cinco dígitos binarios. Estas pueden ser las letras ‘A’ y ‘B’, los números 0 y 1 o cualquier otra cosa que desee.
Hay 2 tipos de cifrados baconianos:
- El cifrado de 24 letras: en el que 2 pares de letras (I, J) y (U, V) tienen los mismos textos cifrados.
|
|
- El cifrado de 26 letras: en el que todas las letras tienen textos cifrados únicos.
|
|
Cifrado
Extraeremos un solo carácter de la string y, si no es un espacio, lo reemplazaremos con su texto cifrado correspondiente de acuerdo con el cifrado que estamos usando; de lo contrario, agregaremos un espacio y lo repetiremos hasta llegar al final de la string. Por ejemplo, ‘A’ se reemplaza con ‘aaaa’
Descifrado
Extraeremos cada conjunto de 5 caracteres de la string cifrada y comprobaremos si el primer carácter de ese conjunto de 5 caracteres es un espacio. De lo contrario, buscaremos su letra de texto sin formato correspondiente del cifrado, la reemplazaremos e incrementaremos el índice del carácter en 5 (para obtener el conjunto de los siguientes 5 caracteres); de lo contrario, si es un espacio, agregamos un espacio y repetimos un proceso incrementando el actual índice de carácter por 1
Acercarse
En Python, podemos mapear pares clave-valor usando una estructura de datos llamada diccionario. Vamos a usar solo un diccionario en el que mapearemos los pares de texto sin formato-texto cifrado como pares clave-valor. Para el cifrado, simplemente buscaremos el texto cifrado correspondiente accediendo al valor utilizando el carácter de texto sin formato correspondiente como clave. En el descifrado, extraeremos cada 5 conjuntos de caracteres de texto cifrado y recuperaremos sus claves del diccionario usándolas como el valor correspondiente. Para un descifrado preciso, utilizaremos el cifrado de 26 letras. Si no está codificando en python, puede idear su propio enfoque.
Implementación:
Python
# Python program to implement Baconian cipher '''This script uses a dictionary instead of 'chr()' & 'ord()' function''' ''' Dictionary to map plaintext with ciphertext (key:value) => (plaintext:ciphertext) This script uses the 26 letter baconian cipher in which I, J & U, V have distinct patterns ''' lookup = {'A': 'aaaaa', 'B': 'aaaab', 'C': 'aaaba', 'D': 'aaabb', 'E': 'aabaa', 'F': 'aabab', 'G': 'aabba', 'H': 'aabbb', 'I': 'abaaa', 'J': 'abaab', 'K': 'ababa', 'L': 'ababb', 'M': 'abbaa', 'N': 'abbab', 'O': 'abbba', 'P': 'abbbb', 'Q': 'baaaa', 'R': 'baaab', 'S': 'baaba', 'T': 'baabb', 'U': 'babaa', 'V': 'babab', 'W': 'babba', 'X': 'babbb', 'Y': 'bbaaa', 'Z': 'bbaab'} # Function to encrypt the string according to the cipher provided def encrypt(message): cipher = '' for letter in message: # checks for space if(letter != ' '): # adds the ciphertext corresponding to the # plaintext from the dictionary cipher += lookup[letter] else: # adds space cipher += ' ' return cipher # Function to decrypt the string # according to the cipher provided def decrypt(message): decipher = '' i = 0 # emulating a do-while loop while True: # condition to run decryption till # the last set of ciphertext if(i < len(message)-4): # extracting a set of ciphertext # from the message substr = message[i:i + 5] # checking for space as the first # character of the substring if(substr[0] != ' '): ''' This statement gets us the key(plaintext) using the values(ciphertext) Just the reverse of what we were doing in encrypt function ''' decipher += list(lookup.keys() )[list(lookup.values()).index(substr)] i += 5 # to get the next set of ciphertext else: # adds space decipher += ' ' i += 1 # index next to the space else: break # emulating a do-while loop return decipher def main(): message = "Geeks for Geeks" result = encrypt(message.upper()) print(result) message = "AABAAABBABABAABABBBABBAAA" result = decrypt(message.lower()) print(result) # Executes the main function if __name__ == '__main__': main()
aabbaaabaaaabaaabababaaba aabababbbabaaab aabbaaabaaaabaaabababaaba ENJOY
Análisis: Este cifrado ofrece muy poca seguridad en la comunicación, ya que es un cifrado de sustitución. Como tal, todos los métodos utilizados para criptoanalizar los cifrados de sustitución se pueden usar para romper los cifrados baconianos. La principal ventaja del cifrado es que permite ocultar el hecho de que se ha enviado un mensaje secreto.
Este artículo es una contribución de Palash Nigam . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA