Crea un'implementazione del cifrario affine, un antico sistema di cifratura nato in Medio Oriente.
Il cifrario affine è un tipo di cifrario a sostituzione monoalfabetico. Ogni carattere viene mappato al suo equivalente numerico, cifrato con una funzione matematica e poi convertito nella lettera corrispondente al suo nuovo valore numerico. Anche se tutti i cifrari monoalfabetici sono deboli, il cifrario affine è molto più forte di quello Atbash, perché ha molte più chiavi.
La funzione di cifratura è:
E(x) = (ai + b) mod m
Dove:
i è l'indice della lettera, da 0 alla lunghezza dell'alfabeto meno 1.m è la lunghezza dell'alfabeto.
Per l'alfabeto latino m è 26.a e b sono numeri interi che costituiscono la chiave di cifratura.I valori a e m devono essere coprimi (o primi tra loro) perché la decifratura automatica riesca, cioè devono avere 1 come unico fattore comune (puoi trovare maggiori informazioni nella voce di Wikipedia sugli interi coprimi).
Se a non è coprimo con m, il programma deve segnalare che si tratta di un errore.
Altrimenti deve cifrare o decifrare con la chiave fornita.
Ai fini di questo esercizio, le cifre sono input validi ma non vengono cifrate.
Gli spazi e i caratteri di punteggiatura sono esclusi.
Il testo cifrato viene scritto in gruppi di lunghezza fissa separati da uno spazio, con la tradizionale dimensione del gruppo di 5 lettere.
Questo rende più difficile indovinare il testo cifrato basandosi sui confini tra le parole.
La funzione di decifratura è:
D(y) = (a^-1)(y - b) mod m
Dove:
y è il valore numerico di una lettera cifrata, cioè y = E(x)
a^-1 è l'inverso moltiplicativo modulare (MMI) di a mod m
a e m sono coprimi.L'MMI di a è x tale che il resto della divisione di ax per m sia 1:
ax mod m = 1
Trovi maggiori informazioni su come calcolare un inverso moltiplicativo modulare e su cosa significhi nella voce di Wikipedia correlata.
"test" con la chiave a = 5, b = 7 si ottiene "ybty"
"ybty" con la chiave a = 5, b = 7 si ottiene "test"
"ybty" con la chiave sbagliata a = 11, b = 7 si ottiene "lqul"
"kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" con la chiave a = 19, b = 13 si ottiene "thequickbrownfoxjumpsoverthelazydog"
"test" con la chiave a = 18, b = 13 è un errore, perché 18 e 26 non sono coprimiCalcolo dell'MMI per a = 15:
(15 * x) mod 26 = 1(15 * 7) mod 26 = 1, cioè 105 mod 26 = 1
7 è l'MMI di 15 mod 26
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.