ebook img

Appunti corso di crittografia A.A. 2020-2021 PDF

103 Pages·2020·0.801 MB·Italian
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Appunti corso di crittografia A.A. 2020-2021

APPUNTI 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

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.