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.

Si el post ha sido de tu agrado te invito a que me sigas para saber cuando haya escrito un nuevo post, haya actualizado algún sistema o publicado un nuevo software. Facebook | X | Instagram | Telegram | También estoy a tus órdenes para cualquier contratación en mi página de contacto