Implemente uma cifra de deslocamento simples como a de César e uma cifra de substituição mais segura.
"Se ele tinha algo confidencial a dizer, escrevia em cifra, ou seja, mudando a ordem das letras do alfabeto de tal forma que nenhuma palavra pudesse ser entendida. Se alguém quiser decifrar essas mensagens e chegar ao seu significado, precisa substituir a quarta letra do alfabeto, isto é, D, por A, e assim com as demais." Suetônio, em Vida de Júlio César
Cifras são algoritmos bem diretos que nos permitem deixar um texto menos legível, mas ainda assim fácil de decifrar. Elas são vulneráveis a muitas formas de criptoanálise, mas César teve sorte de seus inimigos não serem criptoanalistas.
A Cifra de César foi usada em algumas mensagens de Júlio César enviadas para o campo. César sabia que a cifra não era grande coisa, mas tinha um aliado nesse aspecto: quase ninguém sabia ler bem. Então, mesmo errando algumas letras, já bastava para que as pessoas não reconhecessem as poucas palavras que conheciam.
Sua tarefa é criar uma cifra de deslocamento simples como a Cifra de César. Esta imagem é um ótimo exemplo da Cifra de César:
![]()
Por exemplo:
Passar "iamapandabear" como entrada para a função encode retorna a cifra "ldpdsdqgdehdu". Obscura o suficiente para manter nossa mensagem em segredo durante o trânsito.
Quando "ldpdsdqgdehdu" é colocada na função decode, ela retorna o "iamapandabear" original, permitindo que seu amigo leia sua mensagem original.
As cifras de deslocamento rapidamente deixam de ser úteis quando o comandante inimigo as decifra. Então, em vez disso, vamos tentar usar uma cifra de substituição. Tente modificar o código para permitir que especifiquemos uma chave e a usemos como a distância do deslocamento.
Veja um exemplo:
Dada a chave "aaaaaaaaaaaaaaaaaa", codificar a string "iamapandabear" retornaria o "iamapandabear" original.
Dada a chave "ddddddddddddddddd", codificar nossa string "iamapandabear" retornaria o resultado ofuscado "ldpdsdqgdehdu"
No exemplo acima, definimos a = 0 para o valor da chave. Assim, quando o texto claro é somado à chave, acabamos obtendo a mesma mensagem na saída. Portanto, "aaaa" não é uma chave ideal. Mas, se definirmos a chave como "dddd", obteríamos o mesmo resultado da Cifra de César.
O elo mais fraco de qualquer cifra é o ser humano. Vamos deixar sua cifra de substituição um pouco mais tolerante a falhas, fornecendo uma fonte de aleatoriedade e garantindo que a chave contenha apenas letras minúsculas.
Se alguém não informar nenhuma chave, gere uma chave verdadeiramente aleatória com pelo menos 100 caracteres minúsculos de comprimento.
As cifras de deslocamento funcionam deixando o texto um pouco estranho, mas são vulneráveis à análise de frequência. As cifras de substituição ajudam nisso, mas ainda são muito vulneráveis quando a chave é curta ou se os espaços são preservados. Mais adiante, você verá uma solução para esse problema no exercício "crypto-square".
Se você quiser ir mais longe nessa área, as perguntas passam a ser sobre como podemos trocar chaves de forma segura. Dê uma olhada em Diffie-Hellman na Wikipédia para ver uma das primeiras implementações desse esquema.
Experimente usar operações aritméticas, como o módulo, para dar a volta nos índices quando eles ultrapassarem o limite. As classes Character e String também podem ajudar.
Crie sua conta no Exercism para aprender e dominar Pharo com 50 exercícios e mentoria humana de verdade, tudo de graça.