Haskell. Veni Vidi Vici

Esta segunda entrada de programación en Haskell veremos un ejemplo de cifrado Cesar que nos permitirá practicar con la definición de funciones.

Para ponernos en situación veremos que es el cifrado Cesar, y en nuestro caso, con el fin de practicar con la definición de funciones, usaremos el alfabeto latín antiguo, el cual convivió con este cifrado en los años del Circo Romano, los acueductos…

Latín Antiguo.

El alfabeto que usaban en torno al año cero de la era cristiana, en el antiguo imperio romano era el latín antiguo y difería del alfabeto actual de 27 letras si incluimos la “ñ

  • En la Roma Antigua solo teníamos mayúsculas y las letras J,U,Ñ,W no estaban aún en el alfabeto.
  • La J fue I y la U fue V ( JESUS era IESVS ) y no llegan como tales, hasta el siglo XVIII, aunque coexistieron desde el origen ligadas a las letras I y V.
  • X e Y entraron en siglo 2 a.C. por la conquista del Imperio Griego.
  • Las minúsculas llegaron en la Edad Media.
  • La Ñ aparece como sustitución del dígrafo “NN” al final de la Edad Media en algunos alfabetos derivados del latín como el Castellano.
  • W entra en el siglo XIII por influecia de las lenguas germánicas.

Resumiendo nos queda un alfabeto de 23 letras (Sin J,U,Ñ,W) ABCDEFGHIKLMNOPQRSTVYZ

Cifrado Cesar.

El cifrado César,es una de las técnicas de cifrado más simples y más usadas. Es un tipo de cifrado por sustitución en el que una letra en el texto original es reemplazada por otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto. Por ejemplo, con un desplazamiento de 3, la A sería sustituida por la D (situada 3 lugares a la derecha de la A), la B sería reemplazada por la E, etc. Este método debe su nombre a Julio Cesar, que lo usaba para comunicarse con sus generales. Texto obtenido de la Wikipedia

Cifrado Cesar

Programa en Haskell.

Adaptaremos nuestro programa de cifrado Cesar al alfabeto latín antiguo. Nos fijaremos en la definición de la función ya que es lo más significativo del programa.

antiguas :: Int -> Char -> Char
antiguas n c
| elem c [‘A’..’I’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n ) 23)
| elem c [‘J’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23)
| elem c [‘K’..’T’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23)
| elem c [‘U’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23)
| elem c [‘V’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-2 ) 23)
| elem c [‘X’..’Z’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-3) 23)
| elem c [‘ ‘] = ‘ ‘
|otherwise = ‘*’

— Cifrado Cesar latín antiguo versión modulo 23 con 3 desplazamientos.

— Copyright (C) 2019 Vicente Parra Hurtado – NukeBull — Licencia GPL 3


import Data.Char

— Creamos el alfabeto Latín Antiguo

alfabeto :: [Char]
alfabeto = [‘A’..’I’]++[‘K’..’T’]++[‘V’]++[‘X’..’Z’]

— Implementando C. Cesar para cada letra
antiguas :: Int -> Char -> Char
antiguas n c
| elem c [‘A’..’I’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n ) 23)
| elem c [‘J’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23)
| elem c [‘K’..’T’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23)
| elem c [‘U’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23)
| elem c [‘V’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-2 ) 23)
| elem c [‘X’..’Z’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-3) 23)
| elem c [‘ ‘] = ‘ ‘
|otherwise = ‘*’

— Implementamos para String.

cesar :: Int -> String -> String
cesar n xs = [antiguas n x | x <- xs]

main = do

— Mostramos el Alfabeto Latin Antiguo.

putStrLn “Alfabeto latín antiguo”
putStrLn ( show ( alfabeto))

— Pedimos el texto a cifrar.

putStrLn “Introduce el texto a cifrar (Los caracteres que no existían en el latín antiguo se transformaran en *) “
line <- getLine

— Ciframos y deciframos n=3 y n=-3
— El cifrado original cesar es de 3 desplazamientos.

let texto = cesar 3 line
let textoDes = cesar (-3) texto
putStrLn (“Cifro hacía la derecha moviendo 3 posiciones”)
putStrLn ( show ( texto))
putStrLn (“Descifro hacía la izquierda moviendo 3 posiciones corrigiendo J y U “)
putStrLn ( show ( textoDes))

Ejecutamos.

runhaskell CesarAntiguo.hs
Alfabeto latín antiguo
“ABCDEFGHIKLMNOPQRSTVXYZ”
Introduce el texto a cifrar (Los caracteres que no existían en el latín antiguo se transformaran en *)
JULIO CESAR VINI VIDI VICI
Cifro hacía la derecha moviendo 3 posiciones
“MZOMR FHXDV ZMQM ZMGM ZMFM”
Descifro hacía la izquierda moviendo 3 posiciones corrigiendo J y U
“IVLIO CESAR VINI VIDI VICI”

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s