Continúo poniendo scripts de programación en python para automatizar tareas que tengan relación con la criptografía.
a: alfabeto.
ai: carácter i-ésimo del alfabeto.
D: función de descifrado.
ci: carácter i-ésimo del criptograma o texto cifrado.
n: tamaño del alfabeto.
En este post incluyo un script en python para el cifrado y descifrado utilizando el cifrado de Trithemius, criptosistema que sirvió posteriormente de base para el desarrollo del cifrado de Vigenère.
Antes de poner el script, recordar que en este post expliqué cómo se cifraba y descifraba manualmente.
Las funciones de cifrado y descifrado son muy parecidas a las del cifrado de Vigenère, pero sin clave; o mejor dicho, considerando que la clave es igual al alfabeto utilizado (si se usa el alfabeto inglés de 26 letras la clave sería: "ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
Donde:a: alfabeto.
ai: carácter i-ésimo del alfabeto.
E: función de cifrado.
mi: carácter i-ésimo del mensaje o texto en claro a cifrar.D: función de descifrado.
ci: carácter i-ésimo del criptograma o texto cifrado.
n: tamaño del alfabeto.
- Script python del cifrado de Trithemius:
El script es el siguiente:
#!/usr/bin/env python # -*- coding: utf-8 -*- # CIFRADO DE TRITHEMIUS: # # Cifra y descifra textos en claro y criptogramas, respectivamente, # utilizando el criptosistema de Trithemius. # # http://mikelgarcialarragan.blogspot.com/ import re from unicodedata import normalize # FUNCIÓN DE CIFRADO: # La función de cifrado es: E(mi) = (mi + ai) mod n def cifrar(alfabeto,texto_claro): criptograma = '' i = 0 for caracter in texto_claro: criptograma = criptograma + alfabeto[(alfabeto.find(caracter) + alfabeto.find(alfabeto[i % len(alfabeto)])) % len(alfabeto)] i+=1 return criptograma # FUNCIÓN DE DESCIFRADO: # La función de descifrado es: D(Ci) = (Ci - ai) mod n def descifrar(alfabeto,criptograma): texto_claro = '' i = 0 for caracter in criptograma: texto_claro = texto_claro + alfabeto[(alfabeto.find(caracter) - alfabeto.find(alfabeto[i % len(alfabeto)])) % len(alfabeto)] i+=1 return texto_claro def main(): # SELECCIÓN DE ALFABETO: # Se solicita que se indique el alfabeto a emplear. alfabeto = "" while alfabeto == "": print ("") print ("*** SELECCIÓN DE ALFABETO ************************") print ('1. Alfabeto inglés (26 caracteres, "Ñ" excluida).') print ('2. Alfabeto español (27 caracteres, "Ñ" incluida).') print ("") opcion = input("Por favor, seleccione una opción: ") if opcion == "1": alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" elif opcion == "2": alfabeto = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" else: print ("*** ERROR: Opción no válida.") print ("") print ("[+] Alfabeto:", alfabeto) print ("[+] Tamaño del alfabeto (n):", len(alfabeto)) # MENÚ: # Se presenta el menú para que se seleccione una opción. salir = False while not salir: print ("") print ("*** MENÚ *****************************************") print ("1. Cifrar.") print ("2. Descifrar.") print ("3. Salir.") print ("") opcion = input("Por favor, seleccione una opción: ") if opcion == "1": print ("") print ("--- CIFRAR:") # Cifrar: Se introduce el texto en claro. Se convierten los caracteres a mayúsculas y # se eliminan los espacios, las tildes, diéresis, etc. texto_claro = "*" while not texto_claro.isalpha(): texto_claro = input('Texto en claro a cifrar: ').upper() texto_claro = texto_claro.replace(' ','') texto_claro = re.sub(r"([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+", r"\1", normalize("NFD", texto_claro), 0, re.I) texto_claro = normalize("NFC", texto_claro) if texto_claro.isalpha(): print ("[+] Texto en claro a cifrar:", texto_claro) criptograma = cifrar(alfabeto,texto_claro) print ("[+] Criptograma:", criptograma) else: print ("*** ERROR: El texto en claro a cifrar sólo debe contener caracteres alfabéticos.") elif opcion == "2": print ("") print ("--- DESCIFRAR:") # Descifrar: Se introduce el criptograma. Se convierten los caracteres a mayúsculas y # se eliminan los espacios, las tildes, diéresis, etc. criptograma = "*" while not criptograma.isalpha(): criptograma = input('Criptograma a descifrar: ').upper() criptograma = criptograma.replace(' ','') criptograma = re.sub(r"([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+", r"\1", normalize("NFD", criptograma), 0, re.I) criptograma = normalize("NFC", criptograma) if criptograma.isalpha(): print ("[+] Criptograma a descifrar:", criptograma) texto_claro = descifrar(alfabeto,criptograma) print ("[+] Texto en claro:", texto_claro) else: print ("*** ERROR: El criptograma a descifrar sólo debe contener caracteres alfabéticos.") elif opcion == "3": print ("*** FIN ******************************************") salir = True else: print ("*** ERROR: Opción no válida.") if __name__ == '__main__': main()
Lo ejecuto:
- Cifrar:
- Descifrar:
Comentarios
Publicar un comentario