Track
/
Python
Python
/
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

Messaggi delle eccezioni

A volte è necessario sollevare un'eccezione. Quando lo fai, dovresti sempre includere un messaggio di errore significativo per indicare qual è l'origine dell'errore. Questo rende il codice più leggibile e aiuta notevolmente il debug. Nelle situazioni in cui sai che l'origine dell'errore sarà di un certo tipo, puoi scegliere di sollevare uno dei tipi di errore integrati, ma dovresti comunque includere un messaggio significativo.

Questo particolare esercizio richiede che tu usi l'istruzione raise per «sollevare» un ValueError. I test passeranno solo se fai raise dell'exception e includi anche un messaggio con essa.

Per sollevare un ValueError con un messaggio, scrivi il messaggio come argomento del tipo exception:

raise ValueError("a and m must be coprime.")

Fonte

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

Vuoi iniziare Cifrario affine?

Iscriviti a Exercism per imparare e padroneggiare Python con 17 concetti146 esercizi e il mentoring di persone reali, tutto gratis.