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 definição da interface Cipher está em cipher.go.
As tuas implementações devem respeitar a interface Cipher.
type Cipher interface {
Encode(string) string
Decode(string) string
}
Espera-se que Encode ignore todos os valores da string que não sejam A-Za-z; esses valores não serão representados na saída.
A saída será também normalizada para minúsculas.
As funções usadas para obter as cifras são:
func NewCaesar() Cipher { }
func NewShift(distance int) Cipher { }
func NewVigenere(key string) Cipher { }
O argumento de NewShift tem de estar no intervalo de 1 a 25 ou de -1 a -25.
O zero não é permitido.
Para argumentos inválidos, NewShift devolve nil.
O argumento de NewVigenere tem de ser composto apenas por letras minúsculas de a a z.
Não são permitidos valores compostos apenas pela letra 'a'.
Para argumentos inválidos, NewVigenere devolve nil.
Inscreve-te no Exercism para aprenderes e dominares Go com 35 conceitos167 exercícios, e mentoria humana real, tudo grátis.