Cria uma implementação da cifra de Vigenère. A cifra de Vigenère é uma cifra de substituição simples.
Uma cifra é um algoritmo usado para cifrar, ou codificar, uma string. A string não cifrada chama-se texto simples e a string cifrada chama-se texto cifrado. A conversão de texto simples em texto cifrado chama-se codificação, enquanto o inverso se chama descodificação.
Numa cifra de substituição, cada letra do texto simples é substituída por uma letra do texto cifrado, que é calculada com a ajuda de uma chave. (Nota: é possível que a letra de substituição seja a mesma que a letra original.)
Nesta cifra, a chave é uma série de letras minúsculas, como "abcd".
Cada letra do texto simples é deslocada ou rodada numa distância com base numa letra correspondente da chave.
Um "a" na chave significa um deslocamento de 0 (ou seja, nenhum deslocamento).
Um "b" na chave significa um deslocamento de 1.
Um "c" na chave significa um deslocamento de 2, e assim por diante.
A primeira letra do texto simples usa a primeira letra da chave, a segunda letra do texto simples usa a segunda letra da chave, e assim por diante. Se ficares sem letras na chave antes de ficares sem letras no texto simples, começa de novo a partir do início da chave.
Se a chave contiver apenas uma letra, como "dddddd", então todas as letras do texto simples são deslocadas pela mesma quantidade (três neste exemplo), o que faria com que fosse o mesmo que uma cifra de rotação ou cifra de deslocamento (por vezes chamada cifra de César).
Por exemplo, o texto simples "iamapandabear" passaria a ser "ldpdsdqgdehdu".
Se a chave contiver apenas a letra "a" (uma ou mais vezes), a distância de deslocamento é zero e o texto cifrado é igual ao texto simples.
Normalmente, porém, a chave é mais complicada do que isso!
Se a chave for "abcd", então as letras do texto simples seriam deslocadas por uma distância de 0, 1, 2 e 3.
Se o texto simples for "hello", precisamos de 5 deslocamentos, pelo que a chave daria a volta, dando distâncias de deslocamento de 0, 1, 2, 3 e 0.
Aplicando esses deslocamentos às letras de "hello", obtemos "hfnoo".
Se não for fornecida uma chave, gera uma chave que consiste em, pelo menos, 100 letras minúsculas aleatórias do alfabeto latino.
A partir do Python 3.6, existem dois módulos diferentes para produzir números "aleatórios":
O módulo chamado random é pseudoaleatório, ou seja, não gera aleatoriedade verdadeira: segue antes um algoritmo que simula aleatoriedade.
Como estes "números aleatórios" são gerados por um algoritmo conhecido, não são verdadeiramente aleatórios.
Por isso, o módulo random não é adequado para criptografia e não deve ser usado, precisamente por ser pseudoaleatório.
O módulo chamado secrets gera números "aleatórios" criptograficamente fortes, que oferecem a segurança acrescida exigida pela criptografia.
Continuam a ser pseudoaleatórios no sentido mais estrito, mas têm garantias de que os números que produzem são absolutamente imprevisíveis.
Como isto é apenas um exercício de prática, usar o módulo random não faz mal, mas repara que seria muito inseguro se fosse realmente usado para criptografia.
Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.