Ruby

Algoritmo de cifrado ROT13 en Ruby

El algoritmo ROT 13 es una variante del cifrado César (cuya implementación en Ruby ya vimos) en donde el número de rotaciones es 13; la mitad de la cantidad de letras que existen en el alfabeto inglés o como se le diga.

Algoritmo ROT 13 en Ruby

Hoy veremos cómo implementar una función que codifique y decodifique una cadena usando el algoritmo ROT 13 en el lenguaje de programación Ruby.

Ejemplo de ROT 13

Para dar una explicación rápida, la palabra “Hola” se convierte en “Ubyn” porque cada letra se mueve 13 posiciones. De igual manera, al rotar de nuevo la palabra “Ubyn” se convierte en “Hola”.

ROT 13 en Ruby

Esta es una simple variante del algoritmo César; pues rota 13 veces. Debido a que 13 es la mitad de 26, y 26 son las letras del alfabeto inglés, la misma función que codifica puede decodificar.

Por lo tanto la función queda así:

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

=begin
 "Cifrar" y "Descifrar" una cadena con ROT 13, una variante
 del cifrado César. El método funciona tanto para codificar como
 para decodificar.
 
 @author parzibyte
=end
def rot_13(cadena)

 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
  # Rotar
  nueva_posicion = (valor_ascii - limite + 13) % $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"
puts "El mensaje original es '#{mensaje}'"
# El mensaje original es 'Programando en Ruby desde parzibyte.me'
mensaje_cifrado = rot_13 mensaje 
puts "El mensaje cifrado es '#{mensaje_cifrado}'"
# El mensaje cifrado es 'Cebtenznaqb ra Ehol qrfqr cnemvolgr.zr'
mensaje_descifrado = rot_13 mensaje_cifrado
puts "El mensaje descifrado es '#{mensaje_descifrado}'" 
# El mensaje descifrado es 'Programando en Ruby desde parzibyte.me'

Recibe una cadena y regresa una cadena. No importa si la cadena ya está cifrada o está en texto plano, pues siempre rota 13 veces y por lo tanto, si ya está cifrada, la descifra; y si no, entonces la cifra.

Nota: esto seguramente ya lo saben todos pero no está de más repetirlo: ROT13 y César no son cifrados seguros, nunca se deben usar si no es para propósitos educativos.

Te invito a leer la implementación del algoritmo César en Ruby, pues ahí se explica todo con más detalles.

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/

Entradas recientes

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

5 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.