Crie 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 criptografar, ou codificar, uma string. A string não criptografada é chamada de texto claro e a string criptografada é chamada de texto cifrado. Converter texto claro em texto cifrado é chamado de codificação, enquanto o inverso é chamado de decodificação.
Em uma cifra de substituição, cada letra do texto claro é substituída por uma letra do texto cifrado, que é calculada com a ajuda de uma chave. (Repare que a letra substituta pode ser igual à letra original.)
Nesta cifra, a chave é uma sequência de letras minúsculas, como "abcd".
Cada letra do texto claro é deslocada ou rotacionada em uma distância baseada na 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 claro usa a primeira letra da chave, a segunda letra do texto claro usa a segunda letra da chave, e assim por diante. Se as letras da chave acabarem antes das letras do texto claro, comece de novo do início da chave.
Se a chave contiver apenas uma letra, como "dddddd", todas as letras do texto claro serão deslocadas pela mesma quantidade (três, neste exemplo), o que faz disso a mesma coisa que uma cifra de rotação ou cifra de deslocamento (às vezes chamada de cifra de César).
Por exemplo, o texto claro "iamapandabear" se tornaria "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 claro.
Normalmente, porém, a chave é mais complicada que isso!
Se a chave for "abcd", as letras do texto claro serão deslocadas em uma distância de 0, 1, 2 e 3.
Se o texto claro for "hello", precisamos de 5 deslocamentos, então a chave daria a volta, resultando nas distâncias de deslocamento 0, 1, 2, 3 e 0.
Aplicando esses deslocamentos às letras de "hello", obtemos "hfnoo".
Se nenhuma chave for fornecida, gere uma chave composta por pelo menos 100 letras minúsculas aleatórias do alfabeto latino.
random ou secrets aqui?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 de verdade, mas segue um algoritmo que simula aleatoriedade.
Como esses "números aleatórios" são gerados por um algoritmo conhecido, eles não são realmente aleatórios.
Por isso, o módulo random não é adequado para criptografia e não deve ser usado,
justamente porque é pseudoaleatório.
O módulo chamado secrets gera
números "aleatórios" criptograficamente fortes, que oferecem a segurança maior exigida pela criptografia.
Eles ainda são pseudoaleatórios no sentido mais estrito, mas têm garantias de que os números que produzem são absolutamente imprevisíveis.
Como este é apenas um exercício de prática, usar o módulo random não tem problema, mas note que seria
muito inseguro se fosse realmente usado para criptografia.
Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.