Python Quiz 10 – Cómo cifrar cadenas en ROT13 en Python

PyQuiz 10 - Cómo codificar en ROT13 en Python

Pregunta principal del PyQuiz:

>>> import codecs
>>> secret = 'ryclgubavfgn'
>>> msg = codecs.decode(secret, 'rot13')
>>> print(msg)
- ?? -
A = 'ryclgubavfgn'
B = 'elpythonista'
C = UnicodeEncodeError

Concepto y explicación

En esta pregunta se pretende ejercitar una codificación poco común soportada en Python. La codificación de esta pregunta es ‘rot13’.

¿Que es ROT13?

Rot 13 es un tipo de cifrado cesar en el que cada caracter se rota 13 posiciones, y tiene las siguientes características:

  • Soporta 26 caracteres.
  • Los caracteres se mapean uno a uno para realizar las conversiones.
  • Es una codificación que se hace en un solo paso.

La relación gráfica de cada letra es la siguiente:

¿Cómo usar ROT 13 en python?

Al ser un tipo de cifrado sencillo se podría hacer un mapeo entre cada carácter y forma un diccionario en python.

Los diccionarios en Python son unidireccionales, por lo que, sabiendo la clave se puede obtener el valor, pero no al contrario. Por lo tanto hay que crear un diccionario doblemente conectado o añadir todas las claves.

>>> orig = 'ABCDEFGHIJKLM'
>>> tgt = 'NOPQRSTUVWXYZ'
>>> rotmapper = dict(zip(orig + tgt, tgt + orig))
>>> rotmapper
{'A': 'N', 'B': 'O', 'C': 'P', 'D': 'Q', 'E': 'R', 'F': 'S', 'G': 'T', 'H': 'U', 'I': 'V', 
'J': 'W', 'K': 'X', 'L': 'Y', 'M': 'Z', 'N': 'A', 'O': 'B', 'P': 'C', 'Q': 'D', 'R': 'E', 
'S': 'F', 'T': 'G', 'U': 'H', 'V': 'I', 'W': 'J', 'X': 'K', 'Y': 'L', 'Z': 'M'}
>>> rotmapper['B']
'O'
>>> rotmapper['A']
'N'
>>> rotmapper['Z']
'M'

Para poder utilizar este mapeo fácilmente se puede hacer una función que permita iterar por una cadena de caracteres y devuelva la versión ROT13:

>>> def rot_13(cad):
...     orig = 'ABCDEFGHIJKLM'
...     tgt = 'NOPQRSTUVWXYZ'
...     rotmapper = dict(zip(orig + tgt, tgt + orig))
...     return ''.join(rotmapper.get(x.upper(), x) for x in cad)
...
>>> rot_13('hola mundo')
'UBYN ZHAQB'
>>> rot_13('UBYN ZHAQB')
'HOLA MUNDO'

Codificación rot13 en python

Crear esta codificación manualmente con una función es posible como se ha visto en la sección anterior, pero hay una forma aún más fácil de conseguir el mismo resultado en Python usando encoding.

En la librería codecs se puede encontrar la codificación rot13 que permite utilizar este cifrado fácilmente utilizando la función encode de la misma librería codecs.

>>> import codecs
>>> codecs.encode('hola mundo', 'rot13')
'ubyn zhaqb'
>>> codecs.encode('ubyn zhaqb', 'rot13')
'hola mundo'

Solución

Por tanto la solución correcta es la B:

B) ‘elpythonista’


Practica Python con PyQuizzes

En la sección de PyQuizzes puedes encontrar ejercicios prácticos explicados pormenorizado para mejorar tus habilidades como pythonista. ¡No te los pierdas!


Tutorial Python online

Aprender Python de forma gratuita siguiendo las secciones del tutorial de Python.


Libros recomendados para aprender Python

Estos son los libros que pueden ayudarte a aprender Python, aprender a programar, tipos de datos, algoritmia y mucho más.

Disponible en:

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Ver más

  • Responsable: Oscar Ramirez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento: No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a ionos (1&1) que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Publicar un comentario