Ruby

Algoritmo de cifrado César en Ruby

Anteriormente vimos el cifrado César en C y el cifrado César en Python. No explicaré detalladamente cómo funciona el algoritmo pues a ello ya le dediqué otro post.

Lo que nos reúne aquí hoy es la implementación del algoritmo de “cifrado” César en el lenguaje de programación Ruby.

Algoritmo de cifrado César en Ruby

Al final vamos a crear una función que cifra y descifra según el cifrado de César, con un número de rotaciones definido por nosotros.

Función de cifrado césar en Ruby

Ya lo dije arriba pero lo digo de nuevo, aquí no explicaré el algoritmo, solamente pondré la función y cómo es que cada cosa se resuelve usando los métodos del lenguaje.

Dejo el código aquí y lo explico más abajo:

$alfabeto_mayusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$alfabeto_minusculas = "abcdefghijklmnopqrstuvwxyz"
$longitud_alfabeto = 26
$limite_inferior_mayusculas = 65
$limite_inferior_minusculas = 97

=begin
 Rotar una cadena determinadas posiciones
 usando el cifrado César

 @author parzibyte

 La cadena es el mensaje a cifrar o descrifrar
 
 Las rotaciones indican el número de rotaciones con el que se cifra o descifra
 
 La orientación indica si estamos rotando hacia la derecha (codificando)
 o hacia la izquierda (decodificando). Los valores pueden ser 1 o -1; 
 por defecto es 1 (derecha)
=end
def cesar(cadena, rotaciones, orientacion = 1)

 cadena_con_rotaciones = ""
 # Ir letra por letra...
 for letra in cadena.chars
  # Si no es una letra (es un espacio, punto, etcétera) entonces
  # no la rotamos ni cambiamos, ponemos el carácter así como es
  if !letra.match(/^[[:alpha:]]$/)
   cadena_con_rotaciones += letra
   next
  end
  # Suponemos que la letra es mayúscula
  alfabeto = $alfabeto_mayusculas
  limite = $limite_inferior_mayusculas
  # Pero comprobamos y cambiamos si es necesario
  if letra == letra.downcase # ¿Es minúscula?
   alfabeto = $alfabeto_minusculas
   limite = $limite_inferior_minusculas
  end

  valor_ascii = letra.ord
  # Saber si rotamos hacia la izquierda o derecha, así se suma o resta dependiendo de la orientación
  rotaciones_verdaderas = rotaciones * orientacion
  # Rotar
  nueva_posicion = (valor_ascii - limite + rotaciones_verdaderas) % $longitud_alfabeto
  # Y ver cuál carácter está en esa posición
  cadena_con_rotaciones += alfabeto[nueva_posicion]
 end
 # Regresar nueva cadena
 cadena_con_rotaciones
end

mensaje = "Programando en Ruby desde parzibyte.me"
rotaciones = 5
puts "El mensaje original es '#{mensaje}'. Lo vamos a rotar #{rotaciones} posiciones"
# El mensaje original es 'Programando en Ruby desde parzibyte.me'. Lo vamos a rotar 5 posiciones
mensaje_cifrado = cesar(mensaje, rotaciones)
puts "El mensaje cifrado es '#{mensaje_cifrado}'"
# El mensaje cifrado es 'Uwtlwfrfsit js Wzgd ijxij ufwengdyj.rj'
mensaje_descifrado = cesar(mensaje_cifrado, rotaciones, -1)
puts "El mensaje descifrado es '#{mensaje_descifrado}'"
# El mensaje descifrado es 'Programando en Ruby desde parzibyte.me'

Hasta arriba definimos algunas variables globales que servirán de ayudantes; son el alfabeto y los valores del código ASCII en donde inicia la letra A mayúscula y minúscula.

Recorremos toda la cadena carácter por carácter y en cada iteración vemos si no es una letra; en caso de que no sea una letra, dejamos todo intacto.

En caso de que sí sea una letra entonces vemos si es mayúscula o minúscula y a partir de ello obtenemos el valor después de haber sido rotado. Más tarde tomamos el valor que esté en esa posición según el alfabeto a usar.

Me gusta mucho que la función para el cifrado César es “genérica” porque sirve para codificar y decodificar, ya que acepta un tercer parámetro que es 1 o -1; el cual indica el orden de rotación.

Más sobre la función

En primer lugar recibe la cadena, en segundo el número de rotaciones y en tercero el orden de rotación. Si es hacia la derecha es 1, y si es a la izquierda entonces es 2.

Devuelve una cadena la cual es el mensaje cifrado con las rotaciones indicadas.

Por cierto, para probar si es una letra o no, se utilizó una expresión regular; porque Ruby no provee un método como el isalpha del querido C.

Probar cifrado César hecho en Ruby

Si quieres, descarga el ejemplo, instala Ruby y ejecuta el comando ruby main.rb.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.