Rutas
/
Python
Python
/
Ejercicios
/
Cifrado simple
Cifrado simple

Cifrado simple

Fácil

Instrucciones

Crea una implementación del cifrado de Vigenère. El cifrado de Vigenère es un cifrado de sustitución sencillo.

Terminología de cifrado

Un cifrado es un algoritmo que se usa para cifrar, o codificar, un string. El string sin cifrar se llama texto plano y el string cifrado se llama texto cifrado. Convertir texto plano en texto cifrado se llama codificación, mientras que lo contrario se llama descodificación.

En un cifrado de sustitución, cada letra del texto plano se sustituye por una letra del texto cifrado que se calcula con la ayuda de una clave. (Ten en cuenta que la letra de sustitución puede ser la misma que la letra original).

Detalles de la codificación

En este cifrado, la clave es una serie de letras minúsculas, como "abcd". Cada letra del texto plano se desplaza o se rota una distancia que depende de la letra correspondiente de la clave. Una "a" en la clave significa un desplazamiento de 0 (es decir, ningún desplazamiento). Una "b" en la clave significa un desplazamiento de 1. Una "c" en la clave significa un desplazamiento de 2, y así sucesivamente.

La primera letra del texto plano usa la primera letra de la clave, la segunda letra del texto plano usa la segunda letra de la clave, y así sucesivamente. Si se te acaban las letras de la clave antes que las letras del texto plano, vuelve a empezar desde el principio de la clave.

Si la clave solo contiene una letra, como "dddddd", todas las letras del texto plano se desplazan la misma cantidad (tres en este ejemplo), lo que haría de este un cifrado rotacional o cifrado de desplazamiento (a veces llamado cifrado César). Por ejemplo, el texto plano "iamapandabear" se convertiría en "ldpdsdqgdehdu".

Si la clave solo contiene la letra "a" (una o más veces), la distancia de desplazamiento es cero y el texto cifrado es el mismo que el texto plano.

Sin embargo, lo habitual es que la clave sea más complicada. Si la clave es "abcd", las letras del texto plano se desplazarían distancias de 0, 1, 2 y 3. Si el texto plano es "hello", necesitamos 5 desplazamientos, así que la clave daría la vuelta, con distancias de desplazamiento de 0, 1, 2, 3 y 0. Si aplicamos esos desplazamientos a las letras de "hello", obtenemos "hfnoo".

Claves aleatorias

Si no se proporciona ninguna clave, genera una clave que conste de al menos 100 letras minúsculas aleatorias del alfabeto latino.

¿Debería usar random o secrets aquí?

A partir de Python 3.6, hay dos módulos distintos para generar números «aleatorios»:

El módulo llamado random es pseudoaleatorio, lo que significa que no genera aleatoriedad verdadera, sino que sigue un algoritmo que simula la aleatoriedad. Como estos «números aleatorios» se generan mediante un algoritmo conocido, no son verdaderamente aleatorios. En consecuencia, el módulo random no es adecuado para la criptografía y no debería usarse, precisamente porque es pseudoaleatorio.

El módulo llamado secrets genera números «aleatorios» criptográficamente fuertes que proporcionan la mayor seguridad que requiere la criptografía. Siguen siendo pseudoaleatorios en el sentido más estricto, pero tienen garantías de que los números que producen son absolutamente impredecibles.

Como este es solo un ejercicio de práctica, usar el módulo random está bien, pero ten en cuenta que sería muy inseguro si se usara realmente para criptografía.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Python Exercism

¿Listo para empezar Cifrado simple?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.