Készítsd el a Vigenère-rejtjel egy megvalósítását. A Vigenère-rejtjel egy egyszerű helyettesítő rejtjel.
A rejtjel egy algoritmus, amellyel egy stringet titkosítunk, azaz kódolunk. A titkosítatlan stringet nyílt szövegnek, a titkosítottat pedig rejtjelszövegnek nevezzük. A nyílt szöveg rejtjelszöveggé alakítását kódolásnak, a fordítottját dekódolásnak nevezzük.
Egy helyettesítő rejtjelben a nyílt szöveg minden betűjét egy rejtjelszöveg-betűre cseréljük, amelyet egy kulcs segítségével számítunk ki. (Megjegyzés: előfordulhat, hogy a helyettesítő betű megegyezik az eredetivel.)
Ebben a rejtjelben a kulcs kisbetűk sorozata, például "abcd".
A nyílt szöveg minden betűjét eltoljuk vagy elforgatjuk a kulcs megfelelő betűjén alapuló távolsággal.
A kulcsban egy "a" 0 eltolást jelent (vagyis nincs eltolás).
A kulcsban egy "b" 1 eltolást jelent.
A kulcsban egy "c" 2 eltolást jelent, és így tovább.
A nyílt szöveg első betűje a kulcs első betűjét használja, a második betű a kulcs második betűjét, és így tovább. Ha a kulcs betűi elfogynak, mielőtt a nyílt szöveg betűi elfogynának, kezdd újra a kulcs elejéről.
Ha a kulcs csak egyetlen betűt tartalmaz, például "dddddd", akkor a nyílt szöveg minden betűjét ugyanannyival (jelen esetben hárommal) toljuk el, ami ugyanaz, mint az elforgatásos rejtjel vagy eltolásos rejtjel (amit néha Caesar-rejtjelnek is neveznek).
Például a "iamapandabear" nyílt szövegből "ldpdsdqgdehdu" lesz.
Ha a kulcs csak az "a" betűt tartalmazza (egyszer vagy többször), az eltolás mértéke nulla, és a rejtjelszöveg megegyezik a nyílt szöveggel.
A kulcs azonban általában ennél bonyolultabb!
Ha a kulcs "abcd", akkor a nyílt szöveg betűit 0, 1, 2 és 3 távolsággal toljuk el.
Ha a nyílt szöveg "hello", 5 eltolásra van szükség, így a kulcs körbeér, és az eltolási távolságok 0, 1, 2, 3 és 0 lesznek.
Ezeket az eltolásokat a "hello" betűire alkalmazva "hfnoo"-t kapunk.
Ha nincs megadva kulcs, generálj egy kulcsot, amely legalább 100 véletlenszerű, a latin ábécéből származó kisbetűből áll.
A Cipher interfész definíciója a cipher.go fájlban található.
A megvalósításaidnak meg kell felelniük a Cipher interfésznek.
type Cipher interface {
Encode(string) string
Decode(string) string
}
Az Encode várhatóan figyelmen kívül hagyja a szövegben mindazokat a karaktereket, amelyek nem A-Za-z közé esnek, ezek nem jelennek meg a kimenetben.
A kimenet emellett kisbetűssé normalizálódik.
A rejtjelek előállítására szolgáló függvények:
func NewCaesar() Cipher { }
func NewShift(distance int) Cipher { }
func NewVigenere(key string) Cipher { }
A NewShift argumentumának az 1-től 25-ig vagy a -1-től -25-ig terjedő tartományban kell lennie.
A nulla nem megengedett.
Érvénytelen argumentum esetén a NewShift nil-t ad vissza.
A NewVigenere argumentuma csak kisbetűkből, a-tól z-ig állhat.
A csupa „a” betűből álló értékek nem megengedettek.
Érvénytelen argumentum esetén a NewVigenere nil-t ad vissza.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom165 feladat segítségével, valódi emberi mentorálással, mindez ingyen.