Continúo poniendo scripts de programación en python para automatizar tareas que tengan relación con la criptografía.
En este post incluyo un script en python para el cifrado y descifrado utilizando el cifrado autoclave, una variante del cifrado de Vigenère, aunque se puede emplear como variante de cualquier algoritmo de cifrado de sustitución simple polialfabética con clave periódica.
Ya expliqué en este post cómo se cifraba y descifraba manualmente usando este criptosistema, con el que se pretendía impedir el criptoanálisis utilizando el método Kasiski.
- Script python del cifrado autoclave (Vigenère):
El script es el siguiente:
#!/usr/bin/env python # -*- coding: utf-8 -*- # CIFRADO AUTOCLAVE (VARIANTE DE VIGENÈRE): # # Cifra y descifra textos en claro y criptogramas, respectivamente, # utilizando el criptosistema autoclave (variante de Vigenère). # # http://mikelgarcialarragan.blogspot.com/ import re from unicodedata import normalize # FUNCIÓN DE CIFRADO: # La función de cifrado es: Ek(mi) = (mi + Ki) mod n def cifrar(alfabeto,texto_claro,clave): criptograma = '' i = 0 for caracter in texto_claro: criptograma = criptograma + alfabeto[(alfabeto.find(caracter) + alfabeto.find(clave[i % len(clave)])) % len(alfabeto)] i+=1 return criptograma # FUNCIÓN DE DESCIFRADO: # La función de descifrado es: Dk(Ci) = (Ci - Ki) mod n def descifrar(alfabeto,criptograma,clave): texto_claro = '' i = 0 for caracter in criptograma: texto_claro = texto_claro + alfabeto[(alfabeto.find(caracter) - alfabeto.find(clave[i % len(clave)])) % 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 introducen el texto en claro y la clave. Se convierten los caracteres a mayúsculas y # se eliminan de ambos los espacios, las tildes, diéresis, etc. texto_claro =clave = "*" 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) while not clave.isalpha(): clave = input('Clave: ').upper() clave = clave.replace(' ','') clave = re.sub(r"([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+", r"\1", normalize("NFD", clave), 0, re.I) clave = normalize("NFC", clave) if clave.isalpha(): clave += texto_claro print ("[+] Clave:", clave) criptograma = cifrar(alfabeto,texto_claro,clave) print ("[+] Criptograma:", criptograma) else: print ("*** ERROR: La clave sólo debe contener caracteres alfabéticos.") else: print ("*** ERROR: El texto en claro a cifrar sólo debe contener caracteres alfabéticos.") elif opcion == "2": print ("") print ("--- DESCIFRAR:") # Descifrar: Se introducen el criptograma y la clave. Se convierten los caracteres a mayúsculas y # se eliminan de ambos los espacios, las tildes, diéresis, etc. criptograma =clave = "*" 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) while not clave.isalpha(): clave = input('Clave: ').upper() clave = clave.replace(' ','') clave = re.sub(r"([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+", r"\1", normalize("NFD", clave), 0, re.I) clave = normalize("NFC", clave) if clave.isalpha(): print ("[+] Clave:", clave) texto_claro = "" for i in range(0, len(criptograma), len(clave)): texto_claro += descifrar(alfabeto,criptograma[i:i+len(clave)],clave) clave = texto_claro[i:i+len(clave)] print ("[+] Texto en claro:", texto_claro) else: print ("*** ERROR: La clave sólo debe contener caracteres alfabéticos.") 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