Table Of ContentAPPUNTI CORSO DI CRITTOGRAFIA A.A. 2020–2021
MARTINA LANINI
Indice
1. Prime definizioni e cifrari classici 2
1.1. Convenzioni/Notazione 3
1.2. Cifrari additivi 3
1.3. Cifrari a sostituzione 7
1.4. Cifrature a blocco 10
2. Qualche accenno di teoria della complessit`a 14
2.1. Complessit`a di due test di primalit`a antichi 17
2.2. Trial division 19
3. Numeri primi e pseudoprimi 20
3.1. Il Teorema di Wilson 20
3.2. Pseudoprimi di Fermat 21
3.3. Pseudoprimi di Carmichael 23
3.4. La funzione di Carmichael 27
4. Test di primalit`a 40
4.1. Test di Solovay-Strassen 40
5. Complessit`a del test di Solovay Strassen 40
5.1. Costo del calcolo del simbolo di Jacobi 40
5.2. Calcolo di potenze modulari 41
5.3. Pseudoprimi forti e test di Miller Rabin 42
5.4. Test di primalit`a deterministico AKS 50
6. Fattorizzare numeri 57
6.1. Fattorizzazione ρ di Pollard 58
6.2. Fattorizzazione alla Fermat 60
6.3. Frazioni continue 64
6.4. Crivello Quadratico 69
6.5. Estrazione di radici quadrate (modulari) 70
6.6. Metodo p−1 di Pollard 72
7. Crittografia a chiave pubblica 73
7.1. Scambio di chiavi di Diffie-Hellman 73
7.2. Crittosistema di El Gamal 73
7.3. Baby Steps Giant Steps 74
7.4. Crittosistema RSA 75
7.5. Sicurezza ed attacchi 76
Date: 21 dicembre 2020.
1
2 MARTINALANINI
7.6. Attacchi elementari 76
7.7. Frazioni continue e l’attacco di Wiener 78
8. Curve ellittiche 82
8.1. Curve ellittiche, motivazioni 82
8.2. Nozioni di base su curve affini piane 82
8.3. Nozioni di base su curve proiettive piane 84
8.4. Intersezione di curve proiettive e Teorema di B´ezout 85
8.5. Legge di gruppo su cubica proiettiva non singolare 87
8.6. Definizione di curva ellittica e forma normale 90
8.7. Formule di addizione esplicite 93
8.8. Logaritmo discreto per curve ellittiche 95
8.9. Crittografia su curve ellittiche 95
8.10. Codifica e decodifica di numeri in termini di punti di una
curva 97
8.11. Scelta di una curva ellittica e di un punto su di essa 97
8.12. Test di primalit`a di Pockling 98
8.13. Metodo delle curve ellittiche (di Lenstra) 99
Riferimenti bibliografici 103
Quest’anno proveremo a rendere piu` concreto il corso, arricchendolo con
esempidi codici. In particolare, icodiciche riporter`o inquestenote saranno
nel linguaggio di programmazione Python (qui usiamo la version 3.8), che
`e rilasciato in open source e dunque completamente gratuito (www.python.
org/). Per risolvere gli esercizi, potete naturalmente utilizzare altri linguag-
gi di programmazione se vi trovate piu` a vostro agio (ma dovrete riadattare
i programmi presentati al linguaggio da voi scelto).
1. Prime definizioni e cifrari classici
La parola crittografia viene dal greco: κριπτoς significa segreto, mentre
γραφ(cid:15)ιν significa scrivere. Come l’origine della parola, anche la pratica del
criptare messaggi (primariamente per ragioni militari) ha un’origine mol-
to antica. Ad esempio, pare che gi`a gli Egiziani criptassero dei messaggi
nel 2000 a.c. circa, mentre Giulio Cesare era solito usare quello che oggi
chiamiamo cifrario di Cesare per scambiarsi informazioni con i generali. Di-
scuteremo questo esempio nel dettaglio a breve. Sottoliniamo che quest’oggi
la crittografia ha un ruolo fondamentale in moltissime delle nostre azioni
quotidiane: navigare su internet, acquistare prodotti online, pagare con il
bancomat, scambiare messaggi tramite chat1, ...
La crittologia consiste di due sottodiscipline:
1Notate che su WhatsApp sulle Informazioni di uno qualunque dei vostri contatti tro-
vate scritto, sotto la la voce Crittografia, ‘I messaggi inviati a questa chat e le chiamate
sono protetti con la crittografia end-to-end.”
CRITTOGRAFIA 3
• crittografia: produce sistemi per cifrare i messaggi in modo tale
da risultare indecifrabili dalle persone non autorizzate,
• crittoanalisi: si occupa di attaccare i sistemi di cui sopra per
decifrare i messaggi criptati.
Intuitivamente, un buon crittosistema `e una ricetta che permette a chi
vuole criptare un messaggio di farlo senza troppo sforzo, in modo tale che il
destinatario designato lo possa decriptare, nuovamente senza sforzo, ma che
invece sia molto difficile decifrato da chiunque altro. Dobbiamo dunque ren-
dere rigorosi una serie di concetti, ovvero tradurre in linguaggio matematico
la nozione di ricetta, senza sforzo, molto difficile.
Definizione 1.1. Un crittosistema `e il dato di
• un insieme finito P, detto insieme (o spazio) dei messaggi in chiaro,
• un insieme finito C, detto insieme (o spazio) dei messaggi cifrati,
• un insieme finito K, detto insieme (o spazio) delle chiavi,
• una famiglia di funzioni {C : P → C} , dette funzioni di cifratu-
k k∈K
ra,
• una famiglia di funzioni {D : C → P} , dette funzioni di deci-
k k∈K
fratura,
tali che per ogni k ∈ K
(1) D (C (p)) = p per ogni p ∈ P.
k k
Osservazione 1.2. Si noti che la condizione (1) implica che per ogni k ∈ K
la funzione di cifratura C : P → C `e iniettiva.
k
Lospaziodellechiavipu`oesserediduetipologie: parleremodicrittografia
a chiave privata (se la chiave`e stata scambiata tra i due interlocutori prima
dell’iniziodelloscambiodelmessaggio)oachiavepubblica(chenonrichiede
alcun contatto dei due interlocutori che sia precedente al messaggio).
Solitamente,imessaggi(siaquelliinchiarochequellicifrati)sonostringhe
di blocchi di lettere di lunghezza fissata. Questo al fine di rendere innocuo
unattaccobasatosullefrequenzedellelettere(adinizioofinediunaparola).
1.1. Convenzioni/Notazione. Useremo la convenzione, propria di gran
parte della letteratura, di riferirci alle due parti come ai due interlocutori,
che spesso saranno ribattezzati Alice and Bob, dove Alice ha il ruolo del
mittente e Bob quello del ricevente. Spesso gli attacchi saranno ad opera di
Eva.
1.2. Cifrari additivi. Ci occuperemo prima di tutto di sistemi a chiave
segreta simmetrici: Alice e Bob si sono accordati in precedenza su una
chiave segreta, che serve per criptare e per decriptare.
1.2.1. Cifrario di Cesare. Secondo Svetonio, Cesare sostituiva nei suoi mes-
saggiogniletteratramitelaletterachesitrovainposizione+3nell’alfabeto,
4 MARTINALANINI
dove il +3 va intese modulo la lunghezza dell’alfabeto2. Per convenzione,
assumeremo di avere a che fare con l’alfabeto inglese e dunque che lo shift
operato da Cesare fosse modulo 26. Vediamo in questo modo come sin da
subito l’aritmetica modulare entra in gioco.
Percriptareunmessaggiobisognadunqueprimadituttoidentificareogni
lettera dell’alfabeto con un elemento di Z :
26
A B C D E F G H I J K L M
0 1 2 3 4 5 6 7 8 9 10 11 12
N O P Q R S T U V W X Y Z
13 14 15 16 17 18 19 20 21 22 23 24 25
In questo caso dunque abbiamo P = C = Z , K = {3} e possiamo
26
identificare C, risp. D, con C . risp. D :
3 3
C : P → C D : C → P
3 3
p (cid:55)→ p+3, c (cid:55)→ c−3,
Esempio 1.3. Supponiamo che Cesare voglia criptare il messaggio “Ve-
ni vidi vici”. Prima di tutto ci scordiamo degli spazi e identifichiamo il
messaggio con la stringa VENIVIDIVICI, ovvero
21 4 13 8 21 8 3 8 21 8 2 8
che una volta criptata diviene
24 7 16 11 24 11 6 11 24 11 5 11
ed in lettere YHQLYLGLYLSL.
Codice in Python 1. Per scrivere un codice che ci permetta di cifrare
un messaggio con il cifrario di Cesare, dobbiamo prima di tutto tradurre il
messaggio in una stringa di elementi di Z . A tal fine utilizziamo il co-
26
dice ASCII (=American Standard Code for Information Interchange): ogni
carattere che vogliamo cifrare (ovvero, una lettera maiuscola dell’alfabeto
inglese) corrisponde a un numero tra 65 e 90. Nel linguaggio Python la fun-
zione ord() restituisce il codice Ascii di un determinato carattere o simbolo,
la sua funzione inversa `e chr(). Per esempio, per conoscere il codice Ascii
del carattere A digitiamo il seguente comando: ord("A") (gli apici servono
ad indicare che stiamo lavorando con una stringa di testo), che ci fornisce
65 come output, viceversa, digitando chr(65) otteniamo "A". In breve, la
funzione ord(·)-ord("A") restituisce l’elemento di Z corrispondente ad
26
una determinata lettera maiuscola dell’alfabeto inglese, mentre dato un ele-
mento di Z , otteniamola lettera corrispondente tramite la funzione chr(·
26
+ord("A")). Infine, il resto della divisione di un numero intero n per 26 si
ottiene digitando n % 26.
2extant et ad Ciceronem, item ad familiares domesticis de rebus, in quibus, si qua
occultiusperferendaerant,pernotasscripsit,idestsicstructolitterarumordine,utnullum
uerbum effici posset: quae si qui inuestigare et persequi uelit, quartam elementorum
litteram, id est D pro A et perinde reliquas commutet. (Jul. Caes. 56, 6-7)
CRITTOGRAFIA 5
Siamo dunque pronti a scrivere la funzione corrispondente al cifrario di
Cesare:
def cesare cifratura(testo):
testo cifrato = ""
for x in testo:
if x.isupper():
x mod26 = (ord(x) - ord("A"))
x traslata = (x mod26 + 3) % 26
x nuovo = chr(x traslata+ord("A"))
testo cifrato+=(x nuovo)
else:
print("ERRORE: so cifrare solo caratteri alfabetici e in
maiuscolo.")
return
return testo cifrato
Per definire la funzione di decifratura, copiamo la funzione appena
data, con l’accortezza di scambiare 3 con −3.
1.2.2. Cifrario additivo (o shift cipher). In questo caso, P = C = K = Z ,
26
e, scelta una chiave k ∈ K, le funzioni di cifratura e decifratura son definite
C : P → C D : C → P
k k
p (cid:55)→ p+k, c (cid:55)→ c−k.
Vediamo immediatamente che per k = 3 ritroviamo il cifrario di Cesare.
Osservazione 1.4. A volte, sempre per l’identificazione di Z con l’alfa-
26
beto, la chiave pu`o essere indicata come una lettera.
Codice in Python 2. Modifichiamo la funzione definita per il cifrario di
Casare in modo tale che l’argomento non sia solo il testo ma anche un intero
(che possiamo evitare di assumere in Z ). Otteniamo il seguente codice:
26
def shift cipher cifratura(testo,chiave):
testo cifrato = ""
for x in testo:
if x.isupper():
x mod26 = (ord(x) - ord("A"))
x traslata = (x mod26 + chiave) % 26
x nuovo = chr(x traslata+ord("A"))
testo cifrato+=(x nuovo)
else:
print("ERRORE: so cifrare solo caratteri alfabetici e in
maiuscolo.")
return
return testo cifrato
Per ottenere la funzione di decifratura basta porre
def shift cipher decifratura(testo, chiave):
6 MARTINALANINI
testo decifrato=shift cipher cifratura(testo, -chiave)
return test decifrato
Esempio 1.5. Supponiamo di voler criptare “Gregor Samsa, destandosi un
mattino da sogni agitati, si trov`o trasformato nel suo letto in un enorme
insetto immondo”, usando un cifrario additivo con k = 8 (o k = I). Dopo
averriscrittoilmessaggioinmaiuscolo, ignorandospazieaccenti, otteniamo
il seguente messaggio criptato (che abbiamo diviso su due righe per ragioni
di formattazione):
OZMOWZAIUALMABIVLWAQCVUIBBQVWLIAWOVQIOQBIBQAQBZWD
WBZIANWZUIBWVMTACWTMBBWQVCVMVWZUMQVAMBBWQUUWVLW
1.2.3. Crittoanalisi dello shift cipher. Osserviamo che la crittoanalisi del
cifrario additivo non pone grandi problemi ad Eva. Supponiamo che Eva
sappia che Alice e Bob utilizzano il cifrario additivo.
NelcasoincuiEvariesceadintercettareancheunsolocaratteresiacifrato
che in chiaro, `e immediatamente in grado di risalire alla chiave e dunque di
decifrare l’intero messaggio.
D’altronde, Eva riesce a violare facilmente il sistema anche senza aver
accesso al testo in chiaro. Supponiamo infatti che Eva abbia intercettato un
messaggio cifrato con cifrario additivo. Poich´e lo spazio delle chiavi `e Z ,
26
applicare le 26 possibili funzioni di decifratura non richiede molto tempo.
Il crittosistema additivo non `e dunque sicuro, come potete vedere voi stessi
nei seguenti esercizi.
Esercizio 1.6. Si supponga di aver intercettato il seguente messaggio (ci-
frato con shift cipher):
DHRFGBRVYCEVZBRFREPVMVB
Si determini la chiave usata e il messaggio in chiaro. Se lo si fa con un
programma, si alleghi il codice all’esercizio.
Esercizio 1.7. Si supponga di aver intercettato il seguente messaggio:
RNUNFHJNQLJQFYTHTSQFUFSSF
Si determini la chiave usata e il messaggio in chiaro. Se lo si fa con un
programma, si alleghi il codice all’esercizio. Se si fosse solo intercettato il
frammento UFSSF sarebbe comunque stato possibile determinare la chiave?
Esercizio 1.8. Si trovino esempi di parole (di lunghezza > 1) criptate con
un cifrario additivo che singolarmente non sono sufficienti a determinare la
chiave utilizzata.
Esercizio 1.9. Si modifichino i codici di cifratura/decifratura per lo Shift
Cipher in modo tale che la stringa di testo non debba necessariamente con-
sistere di sole lettere maiuscole. Piu` precisamente, si faccia in modo che
anche le lettere minuscole vengano traslate allo stesso modo di quelle maiu-
scole, che tutti i numeri vengano traslati di 3, e che i restanti caratteri non
CRITTOGRAFIA 7
vengano toccati. Per risolvere questo esercizio in Python, pu`o essere utile
sapere che la funzione che determina se un carattere alfabetico `e minuscolo
`e islower(), la funzione che determina se un carattere `e numerico o meno
`e isdigit() (per esempio, l’output di 5.isdigit() `e True, mentre l’output
di "r".isdigit() `e False), la funzione che rende un carattere numerico
un numero intero a tutti gli effetti `e int(), e che la funzione che rende il
suo argomento una stringa di testo `e str().
1.3. Cifrari a sostituzione. Supponiamo che, nuovamente, si abbia P =
C = Z e ricordiamo che la condizione (1) implica l’iniettivit`a di C per
26 k
ogni k ∈ K. Ma una funzione iniettiva da un insieme in se stesso deve
essere necessariamente anche suriettiva e lo stesso deve valere per il suo
inverso (sinistro e destro in questo caso) D . Ne deduciamo pertanto che le
k
funzioni di cifratura e decifratura debbono essere in questo caso biiezioni di
Z insestesso. Possiamocio`eidentificarelospaziodellechiaviconl’insieme
26
delle permutazioni S (che agisce per`o sull’insieme {0,1,...,25}, anzich´e
26
{1,...26} come al solito).
Otteniamo in questo modo il cifrario a sostituzione, in cui, nuovamen-
te P = C = Z , mentre K = S e, per ogni σ ∈ S , le funzioni di
26 26 26
(de)cifratura sono
C : P → C D : C → P
σ σ
p (cid:55)→ σ(p), c (cid:55)→ σ−1(c).
Osserviamo che il cifrario additivo `e un caso particolare del cifrario a so-
stituzione: sommare ad ogni elemento la stessa chiave k `e chiaramente una
biiezione da Z in s´e stesso ed pertanto una permutazione.
26
Codice in Python 3. Rappresentiamo in Python una permutazione in S
26
tramite una lista di lunghezza 26, le cui componenti sono tutti e soli i nu-
meri tra 1 e 26. Per esempio, possiamo definire in Python
sigma=[1, 4, 7, 10, 13, 16, 19, 22, 25, 2, 5, 8, 11, 14, 17, 20,
23, 26, 3, 6, 9, 12, 15, 18, 21, 24]
Il codice che corrisponde alla funzione di cifratura `e il seguente:
def PermutationCipher cifratura(testo,sigma):
testo cifrato = ""
for x in testo:
if x.isupper():
x mod26 = (ord(x) - ord("A"))
x permuted = sigma[x mod26]-1 % 26
x new = chr(x permuted+ord("A"))
encrypted+=(x new)
else:
print("ERRORE: so cifrare solo caratteri alfabetici e in
maiuscolo.")
return
return testo cifrato
8 MARTINALANINI
Esercizio 1.10. Si scelga k ∈ Z (non nullo) e si determini la permu-
26
tazione σ ∈ S corrispondente. Si verifichi che la cifratura del seguente
26
messaggio tramite cifrario additivo con chiave k e cifrario a sostituzione
con chiave σ d`a lo stesso output:
MIOCAROMARCOSONOANDATOSTAMATTINADALMIOMEDICOERMOGENERE
Esercizio 1.11. Si scriva in Python (o nel linguaggio di programmazione
da voi scelto) una funzione che permetta di decifrare un messaggio cifrato
con cifrario a sostituzione una volta nota la chiave utilizzata per cifrare.
1.3.1. Crittoanalisi del cifrario a sostituzione. La crittoanalisi di questo ci-
frario`e senza dubbio piu` interessante di quella necessaria per un cifrario ad-
ditivo: una crittoanalisi esaustiva richiederebbe lo studio di 26! ∼ 4,05·1026
casi, che chiaramente non `e fattibile. Si procede in questi casi con l’analisi
delle frequenze, che si basa sul principio che in ogni lingua la frequenza di
una data lettera in un testo `e (in linea di massima) determinata (si veda,
ad esempio, la tabella a pagina 322 di [BCP]). Questo principio `e vero per
testi lunghi ed incredibilmente spesso anche in testi brevi le frequenze del-
le lettere sono abbastanza costanti. Esistono anche tabelle di frequenza di
digrammi (si veda http://www.crittologia.eu/critto/php/frequenze_
bigrammi_lingua.phtml) e trigrammi. Dunque neppure questo crittosiste-
ma `e ritenuto sicuro. Una possibile difesa da un attacco del genere consiste
nell’alterare le frequenze, facendo modo, ad esempio, di non usare mai una
data lettera.
Codice in Python 4. Sebbene l’esercizio seguente possa essere svolto a
mano, al fine di evitare errori consiglio di farsi aiutare da un computer. Se
volete usare Python, avrete bisogno di una funzione che vi conti le frequenze
di una data lettera in un testo (solo alfabetico in maiuscolo), ad esempio la
seguente funzione prende come argomento una stringa di testo (alfabetico e
maiuscolo) e d`a in output una lista le cui entrate sono coppie composte da
una lettera e il numero di sue occorrenze nel testo:
def FrequenzaCaratteri(testo):
frequenza=[["",0] for i in range(26)]
for i in testo:
frequenza[ord(i)-ord("A")]= [i,frequenza[ord(i)-ord("A")][1]+1]
return frequenza
Sar`a inoltre utile avere una funzione che vi sostituisca una lettera con
un’altra. Al fine di riconoscere i caratteri gi`a decifrati, useremo le lettere
minuscole per il testo in chiaro:
def Sostituzione(testo, CHAR1, char2):
testo modificato=""
for x in testo:
if x==CHAR1:
x=char2
CRITTOGRAFIA 9
testo modificato+=x
return testo modificato
Esercizio 1.12. Scrivere una funzione Python che abbia come argomento
un testo e dia in output le occorrenze di tutti i digrammi.
Esercizio 1.13. In questo esercizio violeremo un cifrario a sostituzione. La
decifratura `e guidata e l’esercizio consiste nel trovare il messaggio in chiaro
fornendo dettagliate spiegazioni circa le scelte fatte, dove vi sono scelte da
operare.
Supponiamo di sapere che il seguente testo `e stato ottenuto cifrando un
testo italiano tramite un cifrario a sostituzione:
OTJPOBSTXAAPLPBEVFPTCBOOPQITFTYBISPXOBJBSSPOBQPNVSSVJGIVQBEEBLP
SSBYVIIBFFPXOFVIVEBATISVWWBGBNSPBOPNXBYIPJBQVNSPOBWPTOVNPAVLVNC
VFEPBIVLKVIBBOLTIBOTSSVVCVNSPYVIEBYIPJBCTESBEBQPCPNBQPSVOVOSVLT
JVVGGVAPOPSTBEEXJVQPXOBEBJYBQBBYVSITEPTNPFXBIQTOVEETNYVLLKPTJBN
VOWBSITCBIVEBEVSPWPBLKVBCVCBNYVIBSTOVEEBLBNBLVIBXOFIBOQVNPEVOWP
TNPXQPCBOTNTETYPLLTEPIXJTIPQBXOBNSBOWBCPLPOBNXBJBJJBNSBCBBEWBOQ
TNPYVINBEXSBIETVIBDXVEETPEFPTIOTBSSVNTQBBOOPPEYIPOLPYPTQVEEBNXB
CVIBCPSBYVONBCBBEEVFPTIOBSVNDXBEEPQVBEEBLLBQVJPBJPEPSBIVNPIPLTI
QTQVEEVBJBIVNVIVQPNSXQPTDXBOQTNVOSPCBAXTIPOVEEVCPVYBNNBIVEBFVOS
VEPGVIBVYIVNXJPGPEJVOSVAVEPLVQVEEVNCVFEPVPOCVIOBEPOVPLBJVITOPFV
EBSPQTCVIPNSBFOBCBEPOLXGTQVEEVYXOPWPTOPIPLTIQTEBYVOBQPLTOSBIVPF
PTIOPBQXOTBQXOTLKVNVJGIBCBOTOAPOPNNVITJBPBQVNNTVIBAPOBEJVOSVXAA
PLPBEVOTOBCVCBYPXQBLTONXJBINPNXPEPGIPOVQBSIVJBIVBEEBCTLVQVENVIF
VOSVVYYXIVSXSSTDXVNSTVIBYBNNBSTSXSSPDXVPFPTIOPLKVFEPVIBOTNVJGIB
SPTQPTNPNPVIBOTTIBJBPLTONXJBSPYVINVJYIVATIJBOQTJVNPVQBOOPLKVOTO
NPNBIVGGVITIPYVSXSPJBPNPBQVNNTVFEPVIBXAAPLPBEVBCIVGGVBCXSTNTEQP
EVGVEEVQTOOVETBCIVGGVITATINVFXBIQBSTJBPOATOQTNPBLLTINVFPTCBOOPQ
ITFTPESVJYTJPFEPTIVEBYIPJBFPTCPOVWWBVIBYITGBGPEJVOSVAPOPSTLTNPQ
ITFTAPNNBCBETNYVLLKPTCVQVCBXOTNSVOSBSTNTIIPNTNXEYITYIPTCTESTLKV
POCBOTBCVCBLVILBSTQPBJBIV
(1) Si verifichi che 5 simboli non compaiono mai nel testo cifrato. Pos-
siamo dunque assumere che essi corrispondono a j,k,w,x,y.
(2) Si trovino i 4 simboli con frequenza maggiore: con grande probabilita`
esse sono le lettere a,e,i,o. Si noti che una ha frequenza abbastanza
minore delle altre: possiamo supporre che sia o.
(3) Tra le 3 lettere rimanenti dal punto precedente, si determinino le due
tali che vi `e frequenza maggiore di doppie. Con grande probabilit`a, si
tratta di a,e dato che la probabilit`a di avere a ed e come lettere ini-
ziali/finali di una parola `e maggiore di quella di avere i come lettera
iniziale/finale di una parola. Abbiamo in questo modo determinato
il carattere che con grande probabilit`a `e i.
(4) Si individui il simbolo che appare con frequenza minima: con grande
probabilit`a esso `e q o z. Se esso `e sempre seguita dallo stesso sim-
bolo, `e molto probabile che sia q (e allora possiamo anche sostituire
10 MARTINALANINI
il simbolo che lo segue con u), altrimenti `e z.
(5) Tra tutti i simboli rimanenti, individuate i 3 che hanno frequenza
maggiore: perquantodetto(edatalabassafrequenzadi u, nelcasoil
punto precedente non vi avesse aiutato ad individuarlo), essi saranno
consonanti; in particolare, corrispondono a l,r,n.
(6) Tra i 3 simboli del punto precedente, individuate quello tale che ha
frequenza maggiore di doppie: si tratta della l.
(7) Usate quanto trovato fino ad ora per determinare quale simbolo del
punto (5) `e ragionevolmente n e quale r.
(8) Al punto (3) avevamo un’ambiguita` che possiamo ora risolvere gra-
zie al fatto che nella nostra lingua il digramma ar `e molto meno
frequente del digramma er.
(9) Tra i simboli rimasti da decifrare, individuate i tre che non compaio-
no mai in doppie: uno di essi corrisponde alla lettera h, determinate
quale.
(10) Notate che il simbolo determinato nel punto precedente `e sempre
preceduto dallo stesso simbolo: quest’ultimo `e molto probabilmente
una c.
(11) Tra i simboli rimanenti, individuate quello che compare con frequen-
za minore: si tratta della z.
(12) Tra i simboli rimanenti, individuate i due che compaiono con le fre-
quenze minori: sono le cifrature delle lettere b,f. Per distinguerle
usate le frequenze dei digrammi ba e fa.
(13) Tra i simboli rimanenti, individuate i due che compaiono con le fre-
quenze maggiori: sono le cifrature delle lettere s,t. Per distinguerle
usate le frequenze dei digrammi ns e nt
A questo punto, se non avete fatto errori, vi sono rimasti da decifrare i
seguenti simboli:
C,F,J,Q,Y
che devono corrispondere alle lettere d, g, m, p, v. Sostituendo dovreste
ora essere in grado di completare la decifratura semplicemente osservando il
testo. Se ci`o non fosse sufficiente, continuate con l’analisi delle frequenze.
1.4. Cifrature a blocco.
Definizione 1.14. Un crittosistema (P,C,K,{C },{D }) sull’alfabeto Σ `e
k k
detto cifratura a blocco se esiste un r ∈ Z tale che P = C = Σr. In tal
≥1
caso r `e detta ampiezza (o lunghezza) del blocco.
Osservazione 1.15. Il cifrario di Cesare `e un esempio di una cifratura a
blocco con r = 1 (e Σ = Z ).
26
Codice in Python 5. Definiamo ora una funzione che prende come argo-
mento una stringa di testo e un intero r ∈ Z . Se la lunghezza della stringa
≥1
non un multiplo di r la completa aggiungendo tante X quante la differenza
tra r ed il resto della divisione della lunghezza per r. L’output `e una matrice
i cui elementi sono i corrispondenti in Z delle lettere del testo in input (il
26