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.
A definição da interface Cipher está em cipher.go.
Suas implementações devem estar de acordo com 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; eles não serão representados na saída.
A saída também será 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 deve estar no intervalo de 1 a 25 ou de -1 a -25.
Zero não é permitido.
Para argumentos inválidos, NewShift retorna nil.
O argumento de NewVigenere deve ser composto apenas por letras minúsculas de a-z.
Valores compostos inteiramente pela letra 'a' não são permitidos.
Para argumentos inválidos, NewVigenere retorna nil.
Crie sua conta no Exercism para aprender e dominar Go com 35 conceitos167 exercícios e mentoria humana de verdade, tudo de graça.