Track
/
JavaScript
JavaScript
/
Esercizi
/
Cifrario affine
Cifrario affine

Cifrario affine

Medio

Istruzioni

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.

Cifratura

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.

Decifratura

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)
  • è importante notare che a^-1 è l'inverso moltiplicativo modulare (MMI) di a mod m
  • l'inverso moltiplicativo modulare esiste solo se 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.

Esempi generali

  • Cifrando "test" con la chiave a = 5, b = 7 si ottiene "ybty"
  • Decifrando "ybty" con la chiave a = 5, b = 7 si ottiene "test"
  • Decifrando "ybty" con la chiave sbagliata a = 11, b = 7 si ottiene "lqul"
  • Decifrando "kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" con la chiave a = 19, b = 13 si ottiene "thequickbrownfoxjumpsoverthelazydog"
  • Cifrare "test" con la chiave a = 18, b = 13 è un errore, perché 18 e 26 non sono coprimi

Esempio di calcolo di un inverso moltiplicativo modulare (MMI)

Calcolo 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

Fonte

WikipediaIl link si apre in una nuova finestra o scheda
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
JavaScript Exercism

Vuoi iniziare Cifrario affine?

Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.