Percursos
/
Pharo
Pharo
/
Exercícios
/
Cifra simples
Cifra simples

Cifra simples

Médio

Instruções

Implementa uma cifra de deslocamento simples, como a de César, e uma cifra de substituição mais segura.

Passo 1

"Se tinha algo confidencial para dizer, escrevia-o em cifra, isto é, alterando de tal modo a ordem das letras do alfabeto que não se conseguia decifrar uma única palavra. Quem queira decifrá-las e chegar ao seu significado tem de substituir a quarta letra do alfabeto, ou seja, o D, pelo A, e assim com as restantes." Suetónio, Vida de Júlio César

As cifras são algoritmos muito simples que nos permitem tornar o texto menos legível sem deixar de o tornar fácil de decifrar. São vulneráveis a muitas formas de criptoanálise, mas César teve a sorte de os seus inimigos não serem criptanalistas.

A cifra de César foi usada em algumas mensagens de Júlio César enviadas para o campo de batalha. César sabia que a cifra não era grande coisa, mas tinha um aliado nesse aspeto: quase ninguém sabia ler bem. Por isso, bastava enganar-se em duas letras para que as pessoas não reconhecessem as poucas palavras que ainda conheciam.

A tua tarefa é criar uma cifra de deslocamento simples, como a cifra de César. Esta imagem é um excelente exemplo da cifra de César:

Cifra de César

Por exemplo:

Dar "iamapandabear" como valor de entrada à função encode devolve a cifra "ldpdsdqgdehdu". Suficientemente obscura para manter a nossa mensagem em segredo durante o trânsito.

Quando se coloca "ldpdsdqgdehdu" na função decode, ela devolve o "iamapandabear" original, o que permite ao teu amigo ler a tua mensagem original.

Passo 2

As cifras de deslocamento deixam rapidamente de ser úteis quando o comandante adversário as descobre. Por isso, em vez disso, vamos tentar usar uma cifra de substituição. Experimenta alterar o código para nos permitir indicar uma chave e usá-la como distância de deslocamento.

Aqui tens um exemplo:

Dada a chave "aaaaaaaaaaaaaaaaaa", codificar a string "iamapandabear" devolveria o "iamapandabear" original.

Dada a chave "ddddddddddddddddd", codificar a nossa string "iamapandabear" devolveria o resultado obscurecido "ldpdsdqgdehdu"

No exemplo acima, definimos a = 0 para o valor da chave. Assim, quando o texto simples é somado à chave, obtemos a mesma mensagem à saída. Por isso, "aaaa" não é uma chave ideal. Mas se definirmos a chave como "dddd", obtemos o mesmo resultado que a cifra de César.

Passo 3

O elo mais fraco de qualquer cifra é o ser humano. Vamos tornar a tua cifra de substituição um pouco mais tolerante a falhas, fornecendo uma fonte de aleatoriedade e garantindo que a chave contém apenas letras minúsculas.

Se ninguém fornecer qualquer chave, gera uma chave verdadeiramente aleatória com, pelo menos, 100 carateres minúsculos.

Extensões

As cifras de deslocamento funcionam tornando o texto ligeiramente estranho, mas são vulneráveis à análise de frequências. As cifras de substituição ajudam nisso, mas continuam muito vulneráveis quando a chave é curta ou se os espaços forem preservados. Mais à frente vais ver uma solução para este problema no exercício "crypto-square".

Se quiseres ir mais longe nesta área, as questões passam a ser sobre como podemos trocar chaves de forma segura. Dá uma vista de olhos a Diffie-Hellman na Wikipédia para veres uma das primeiras implementações deste esquema.

Nota

Tenta usar operações aritméticas, como o módulo, para dar a volta aos índices quando estes ultrapassam o limite. As classes Character e String também são tuas amigas.

Editar via GitHub A ligação abre numa nova janela ou separador
Pharo Exercism

Estás pronto para começar Cifra simples?

Inscreve-te no Exercism para aprenderes e dominares Pharo com 50 exercícios, e mentoria humana real, tudo grátis.