Crée une implémentation du chiffre de Vigenère. Le chiffre de Vigenère est un chiffre de substitution simple.
Un chiffre est un algorithme qui sert à chiffrer, ou encoder, une string. La string non chiffrée s'appelle le texte en clair et la string chiffrée s'appelle le texte chiffré. Convertir du texte en clair en texte chiffré s'appelle l'encodage, tandis que l'opération inverse s'appelle le décodage.
Dans un chiffre de substitution, chaque lettre du texte en clair est remplacée par une lettre du texte chiffré, calculée à l'aide d'une clé. (À noter qu'une lettre de remplacement peut être identique à la lettre d'origine.)
Dans ce chiffre, la clé est une suite de lettres minuscules, comme "abcd".
Chaque lettre du texte en clair subit un décalage ou une rotation d'une distance calculée à partir de la lettre correspondante de la clé.
Un "a" dans la clé correspond à un décalage de 0 (c'est-à-dire aucun décalage).
Un "b" dans la clé correspond à un décalage de 1.
Un "c" dans la clé correspond à un décalage de 2, et ainsi de suite.
La première lettre du texte en clair utilise la première lettre de la clé, la deuxième lettre du texte en clair utilise la deuxième lettre de la clé, et ainsi de suite. Si tu épuises les lettres de la clé avant d'épuiser celles du texte en clair, reprends depuis le début de la clé.
Si la clé ne contient qu'une seule lettre, comme "dddddd", toutes les lettres du texte en clair sont alors décalées de la même distance (trois dans cet exemple), ce qui en fait l'équivalent d'un chiffre par rotation ou par décalage (parfois appelé chiffre de César).
Par exemple, le texte en clair "iamapandabear" deviendrait "ldpdsdqgdehdu".
Si la clé ne contient que la lettre "a" (une ou plusieurs fois), la distance de décalage est nulle et le texte chiffré est identique au texte en clair.
En général, la clé est quand même plus compliquée que ça !
Si la clé est "abcd", les lettres du texte en clair sont décalées d'une distance de 0, 1, 2 et 3.
Si le texte en clair est "hello", il faut 5 décalages, donc la clé recommence depuis le début, ce qui donne des distances de décalage de 0, 1, 2, 3 et 0.
En appliquant ces décalages aux lettres de "hello", on obtient "hfnoo".
Si aucune clé n'est fournie, génère une clé composée d'au moins 100 lettres minuscules aléatoires de l'alphabet latin.
La définition de l'interface Cipher se trouve dans cipher.go.
Tes implémentations doivent être conformes à l'interface Cipher.
type Cipher interface {
Encode(string) string
Decode(string) string
}
On s'attend à ce que Encode ignore tous les caractères de la string qui ne sont pas A-Za-z ; ils ne seront pas représentés dans la sortie.
La sortie sera également normalisée en minuscules.
Les fonctions utilisées pour obtenir les chiffrements sont :
func NewCaesar() Cipher { }
func NewShift(distance int) Cipher { }
func NewVigenere(key string) Cipher { }
L'argument de NewShift doit être compris entre 1 et 25 ou entre -1 et -25.
Zéro n'est pas autorisé.
Pour des arguments invalides, NewShift renvoie nil.
L'argument de NewVigenere ne doit contenir que des lettres minuscules, de a à z.
Les valeurs composées uniquement de la lettre « a » ne sont pas autorisées.
Pour des arguments invalides, NewVigenere renvoie nil.
Inscris-toi sur Exercism pour apprendre et maîtriser Go avec 34 concepts165 exercices, et un vrai mentorat humain, le tout gratuitement.