Trilhas
/
Python
Python
/
Exercícios
/
Cifra simples
Cifra simples

Cifra simples

Fácil

Instruções

Crie uma implementação da cifra de Vigenère. A cifra de Vigenère é uma cifra de substituição simples.

Terminologia de cifras

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.)

Detalhes da codificação

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".

Chaves aleatórias

Se nenhuma chave for fornecida, gere uma chave composta por pelo menos 100 letras minúsculas aleatórias do alfabeto latino.

Devo usar 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.

Editar via GitHub O link abre em uma nova janela ou aba
Python Exercism

Tudo pronto para começar Cifra simples?

Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.