Python Quiz 10 – Cómo cifrar cadenas 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.