CTX - 07 - Cifrari Classici


1 Informazioni Lezione

Data: [2018-03-28 mer]


In questa lezione abbiamo introdotto vari cifrari classici basati sulla permutazione delle lettere di un alfabeto. Per ogni cifrario abbiamo discusso il modello matematico in questione e abbiamo fatto delle considerazioni rispetto alla sicurezza del modello, andando anche ad analizzare come un attaccante può procedere per rompere questo tipo di schemi di cifrazione.

2 Modello Matematico di Crittosistema

Un crittosistema è rappresentato da un insieme di regole e tecniche che permettono la trasformazione di un messaggio inizialmente scritto in modo comprensibile, il testo in chiaro (in inglese plaintext), in un altro messaggio, che non risulta più essere comprensibile, il testo cifrato (in inglese ciphertext). Questa trasformazione da plaintext a ciphertext viene effettuata tramite una procedura, un algoritmo, che prende in input il testo da cifrare e la chiave di cifratura e produce in output il testo cifrato. Il testo cifrato viene infine inviato nei canali di comunicazione per raggiungere il destinatario.

Una proprietà fondamentale che un crittosistema sicuro deve garantire è che la trasformazione inversa, quella che trasforma il testo cifrato in testo in chiaro può essere eseguita in modo veloce solamente conoscendo la chiave di decifratura, un parametro segreto del sistema che idealmente possono conoscere solamente il mittente e il destinatario del messaggio. Per chi non possiede la chiave di decifratura deve essere "praticamente impossibile" ricostruire il messaggio in chiaro a partire dal messaggio cifrato. Infine, anche la ricostruzione della chiave di decifrazione a partire dal testo cifrato deve essere "praticamente impossibile" da effettuare.

Per riassumere, il compito di un crittosistema è quello di proteggere il significato di un messaggio in chiaro, trasformandolo in un messaggio cifrato tramite un fissato algoritmo e una particolare chiave di cifratura. Il sistema deve poi garantire che la trasformazione inversa possa essere effettuata in modo veloce solamente dai possessori della chiave di decifratura. Infine, la chiave di decifratura deve essere praticamente impossibile da ricostruire a partire dal messaggio cifrato.

Le persone che si occupano di definire sistemi del genere prendono il nome di crittologi, e in generale la crittologia è lo studio delle caratteristiche e proprietà dei crittosistemi.

Formalmente un crittosistema è definito da una tripla \(\langle P, C, K\rangle\), dove:

  • \(P\) rappresenta l'insieme dei messaggi in chiaro. Un messaggio in chiaro è rappresentato dal simbolo \(p\) per ricordare la parola inglese plaintext.

  • \(C\) rappresenta l'insieme dei messagi cifrati. Un messaggio cifrato è rappresentato dal simbolo \(c\) per ricordare la parola inglese cipher text.

  • \(K\) rappresenta l'insieme delle chiavi. Una chiave \(k \in K\) definisce due trasformazioni, una trasformazione di cifratura \(C_k : P \to C\), che permette di passare dal testo in chiaro \(p \in P\), al testo cifrato \(C_k(p) \in C\), e una trasformazione di decifratura \(D_k : C \to P\), che permette di passare dal testo cifrato al testo in chiaro. In particolare si deve avere che \(D_k = C_k^{-1}\), ovvero che

    \[\forall \,\, p \in P: \,\,\,\,\, D_k(C_k(p)) = p\]

Per semplificare la trattazione matematica associamo ad ogni lettera dell'alfabeto inglese un numero, chiamato l'equivalente numerico nel seguente modo: alla \(A\) associamo lo \(0\), alla \(B\) associamo il numero \(1\), continuando così fino alla \(Z\), a cui associamo il numero \(25\). Il nostro alfabeto di lavoro diventa quindi \(\mathbb{Z}_{26}\).

3 Cifrari Monoalfabetici

Per la trattazione di questi sistemi consideriamo i seguenti oggetti:

  • \(p = (p_1, p_2, ..., p_n)\) è il messaggio in chiaro che si vuole nascondere. I vari \(p_i\) sono gli equivalenti numerici delle lettere del messaggio, e quindi \(p_i \in \mathbb{Z}_{26}\).

  • \(c = (c_1, c_2, ..., c_n)\) è il messaggio cifrato da inviare. Nuovamente abbiamo che \(c_i \in \mathbb{Z}_{26}\).

  • \(k = (k_c, k_d)\) è la chiave utilizzata. In particolare \(k_c\) è la chiave per cifrare e specifica la trasformazione di cifratura \(C_k\), e \(k_d\) è la chiave per decifrare e specifica la trasformazione di decifratura \(D_k\).

I cifrari monoalfabetici sono caratterizzati dal fatto che per cifrare un certo messaggio utilizzano un solo alfabeto, dove per alfabeto si intende una sola regola di cifrazione che specifica, dato un equivalente numerico \(p \in \mathbb{Z_n}\), come otteniamo il suo equivalente numerico cifrato \(c(p) \in \mathbb{Z}_n\).


3.1 Cifrario di Cesare

Il primo esempio documentato dell'utilizzo di tecniche crittografiche al fine di proteggere i messaggi è stato ricondotto a Giulio Cesare. Lo schema di cifrazione, o cifrario, utilizzato da Cesare, entra nella famiglia dei cifrari monoalfabetici.

Quando Cesare voleva inviare in modo sicuro un messaggio--generalmente scritto in latino o greco--traslava ogni lettera del messaggio in chiaro con la lettera che si trovava, nell'alfabeto ordinato, tre posti a destra da quella di partenza. Applicando questa procedura otteneva quindi un nuovo messaggio, il messaggio cifrato, che avrebbe poi inviato al posto di quello in chiaro.

Questo schema di cifrazione può essere visualizzato facilmente posizionando l'alfabeto originario con l'alfabeto traslato in modo tale che ad ogni lettera di quello originare corrisponde la relativa lettera di quello traslato. Utilizzando l'alfabeto inglese otteniamo:

dove le lettere in minuscolo rappresentano le lettere presenti nel plaintext, mentre quelle in maiuscolo rappresentano le lettere che vanno a finire nel ciphertext. Se vogliamo cifrare un messaggio con questo schema, basta sostiutire ogni lettera dell'alfabeto originario con la corrispondete nell'alfabeto traslato. Ad esempio il messaggio

\[\text{domani attacheremo}\]

cifrato con il metodo utilizzato da Cesare diventa

\[\text{GRPDQL DWWDFKHUHPR}\]

Chi riceveva il messaggio poi, per poter ricostruire il testo in chiaro, doveva semplicemente invertire l'operazione effettuata: al posto di traslare di tre posti a destra l'alfabeto, lo si doveva traslare tre posti a sinistra.


Andando a formalizzare matematicamente lo schema e generalizzando l'idea della traslazione ad un qualsiasi valore otteniamo il seguente crittosistema:

  • La chiave di cifratura rappresenta di quanto trasliamo le lettere dell'alfabeto a destra. Potendo effettuare \(25\) traslazioni non banali, abbiamo che

    \[k_c = b \in \mathbb{Z}_{26} \setminus \{0\}\]

    L'operazione di cifraggio di un messaggio in chiaro \(p = (p_1, ..., p_n)\) per ottenere un messaggio cifrato \(c = (c_1, ..., c_n)\) consiste nello shiftare ogni lettera \(p_i\) ed è descritta da

    \[c_i \equiv p_i + b \mod 26\]

  • La chiave di decifratura invece è l'opposto della chiave di cifratura. Infatti, se trasliamo di \(b\) passi a destra le lettere per cifrare, dovremmo traslare le lettere cifrate di \(b\) passi a sinistra per ottenere il testo originario. Dunque,

    \[k_d = -b = N - b \in \mathbb{Z}_{26} \setminus \{0\}\]

    L'operazione di decifrazione di un messaggio cifrato \(c = (c_1, ..., c_n)\), al fine di ottenere il messaggio in chiaro originario \(p = (p_1, ..., p_n)\) è descritta da:

    \[p_i \equiv c_i - b \mod 26\]

Gli schemi di cifratura che rispettano questo modello vengono chiamati cifrari di cesare proprio perché sono delle generalizzazioni dello schemo usato da Cesare. Quando la chiave di cifratura \(k_c = 3\) otteniamo infatti esattamente lo schema utilizzato da Cesare.


3.1.1 Analisi del Cifrario di Cesare

Notiamo che il numero di chiavi per questo sistema è molto limitato: escludendo la chiave di cifratura \(k_c = 0\), che non muove l'alfabeto, le chiavi sono infatti solamente \(25\).

Inoltre, la chiave di cifratura \(k_c\) e quella di decifrazione \(k_d\) sono essenzialmente la stessa. In altre parole, sapendo \(k_c\) non ci costa niente calcolarci \(k_d\) e viceversa. Questo vuol dire che se un nemico conosce il modo in cui nascondiamo i messaggi, conoscerà anche il modo in cui può invertire questo processo.

Notiamo infine che le operazioni di cifratura e decifratura richiedono entrambe \(O(\log n)\) se si conosce la chiave. In realtà, anche se non si è a conoscenza della chiave, si può semplicemente fare un brute-force, provando tutte le possibili chiavi, che sono molto poche, per vedere qual'è la chiave giusta. Anche senza fare il brute-force, ci basta congettutare che ad una lettera cifrata corrisponda una lettera in chiaro, e se siamo corretti siamo in grado di calcolare la chiave in modo banale. Per fare queste congetture possiamo effettuare una analisi delle frequenze, ma di questo ne parleremo successivamente.

Concludiamo osservando che rompere questo schema risulta estremamente elementare con l'utilizzo dei computers.



3.2 Cifrari Affini

Generalizzando il cifrario di Cesare otteniamo i cifrari affini. Questi cifrari funzionano nel seguente modo:

  • La chiave di cifratura questa volta è descritta da due interi \(k_c = (a, b)\), con \(a, b \in \mathbb{Z}_n\). Per fare in modo che la cifratura sia invertibile si richiede che \(a\) sia coprimo con \(n = 26\), ovvero che \(MCD(a, n) = 1\). L'operazione di cifrazione consiste in una particolare permutazione delle lettere, ed è descritta come segue

    \[c_i \equiv ap_i + b \mod n\]

  • La chiave per decifrare è invece data da \(k_d = (a^{-1}, -b)\). Notiamo che \(a^{-1}\) esiste sempre dato che abbiamo richiesto \(MCD(a, n) = 1\). L'operazione di decifrazione è invece descritta come segue

    \[p_i \equiv a^{-1}(c_i - b) \mod n\]

Notiamo che se \(a = 1\), allora otteniamo i cifrari di cesare. I cifrari di cesare sono quindi un caso particolare dei cifrari affini.


3.2.1 Numero di chiavi

Nuovamente, entrambe le operazioni di cifratura e decifratura richiedono tempo polinomiale rispetto ad \(n\), e sono quindi considerate facili da eseguire, se si possiede la chiave. E nuovamente, se conosco la chiave per cifrare mi posso calcolare velocemente quella per decifrare. Le chiavi sono quindi simmetriche anche in questo caso.

Questa volta abbiamo però aumentato il numero di chiavi, arrivando ad un totale di \(312\) chiavi. Una chiave è infatti definita da una coppia \((a, b)\), con \(MCD(n, a) = 1\). Dunque,

\[\begin{split} \text{number of keys} &= \varphi(n) \cdot n \\ &= \varphi(26) \cdot 26 \\ &= \varphi(2)\varphi(13) \cdot 26 \\ &= 12 \cdot 26 \\ &= 312 \end{split}\]

Siamo quindi riusciti ad aumentare il numero delle chiavi. Possiamo essere sicuri che adesso il sistema risulta effettivamente più sicuro rispetto al semplice cifrario di cesare? La risposta a questa domanda in realtà è negativa: no, non risulta più sicuro. Infatti, anche se il numero di chiavi è aumentato, arrivando ad un punto che forse un attaccante non avrebbe abbastanza pazienza per provare tutte le combinazioni a mano, non abbiamo comunque risolto uno dei problemi fondamentali per questo tipo di schemi: la frequenza delle lettere dei linguaggi naturali.

Le lettere utilizzate nei linguaggi naturali non appaiono tutte con la stessa frequenza, alcune sono più frequenti di altre. Questo vuol dire che schemi di cifratura che associano ad una lettera un'altra lettera, ovvero schemi monoalfabetici, non riescono ad eliminare completamente questo tipo di informazione: la lettera cifrata che appare più frequentemente sarà molto probabilmente associata ad una delle più lettere più frequenti nel particolare linguaggio. Un crittoanalista può quindi fare delle congetture, associando a lettere del testo cifrato determinate lettere del testo in chiaro, per cercare di scoprire la chiave. Per maggiori informazioni si rimanda a Zipf's law.



3.2.2 Crittoanalisi dei cifrari affini

Supponiamo di essere un crittoanalista interessato a rompere uno schema di cifratura affino. In particolare vogliamo scoprire il valore della chiave di cifrazione \((a, b)\) da cui poi possiamo ricavare la chiave di decifrazione \((a^{-1}, -b)\) in modo veloce. Supponiamo infine di aver trovato aver trovato un certo testo cifrato \(c = (c_1, c_2, ...c_n) \in C\) e un certo testo in chiaro \(p = (p_1, p_2, ..., p_n) \in P\).

Quello che possiamo fare è congetturare che a determinate lettere del testo cifrato corrispondano determinate lettere del testo in chiaro. In altre parole, possiamo congetturare che la chiave \((a, b)\) rispetta il seguente sistema di congruenze

\[\begin{cases} c_1 \equiv ap_1 + b \mod 26 \\ c_2 \equiv ap_2 + b \mod 26 \end{cases}\]

Per ottenere la chiave, possiamo quindi risolvere il sistema. Nella risoluzione troviamo la seguente equazione congruenziale

\[c_1 - c_2 \equiv a(p_1 - p_2) \mod 26\]

A questo punto possono succedere varie cose:

  • Se \(MCD(p_1 - p_2, 26) \not | c_1 - c_2\), allora non ho soluzioni e la mia congettura è sbagliata. Devo tentare con una congettura diversa.

  • Se \(MCD(p_1 - p_2, 26) = 1\), allora ho una sola soluzione che me la calcolo nel seguente modo:

    \[\begin{cases} a = (p_1 - p_2)^{-1} \cdot (c_1 - c_2) \\ b = c_2 - p_2(p_1 - p_2)^{-1} \cdot (c_1 - c_2) \end{cases}\]

    Una volta calcolata la chiave \((a, b)\) la posso poi provare con altro testo cifrato. Se continua a funzionare, allora ho scoperto la vera chiave; altrimenti faccio un'altra congettura, basandomi su nuove informazioni o rivedendo quelle vecchie.

  • Se \(MCD(p_1 - p_2, 26) = d\), allora mi possono risolvere l'equazione ridotta

    \[\frac{p_1 - p_2}{d} a \equiv \frac{c_1 - c_2}{d} \mod \frac{26}{d}\]

    che, per costruzione, ha una soluzione univoca. Partendo dalla singola soluzione, mi calcolo tutte le soluzioni che sono congrue tra loro modulo \(\frac{26}{d}\), ma non modulo \(26\). Per ciascuna soluzione calcolata, la testo con altro testo cifrato, per verificare se la soluzione funziona oppure no. Se nessuna solutione mi è utile, allora devo fare un'altra congettura.

Notiamo che la crittoanalisi non è mai una procedura sicura, e che in generale è molto complessa e dispendiosa da effettuare, specialmente quando abbiamo poche informazioni sul nemico e sui cifrari che sta utilizzando. In ogni caso, l'analisi delle frequenza del testo cifrato ci permette di fare delle buone congetture, che possono poi essere verificare nel metodo appena descritto. Ovviamente queste congetture funzionano solamente per cifrari basati sulla sostituzione alfabetica.

4 Cifrari Polialfabetici

Una possibile evoluzione degli schemi di cifratura di tipo monoalfabetico è costituita dagli schemi di cifratura che utilizzano più alfabeti, ossia più regole, per cifrare il testo. Così facendo una parte del messaggio viene cifrato con un alfabeto, e un'altra parte con un'altro alfabeto. Questa cifrari vengono chiamati cifrari polialfabetici.

Per fare un esempio, supponiamo di voler cifrare un testo utilizzando \(s\) alfabeti. Spezziamo il testo in blocchi da \(s\) lettere ciascuno, aggiungendo alla fine dei caratteri nulli per far si che la lunghezza totale sia divisibile per \(s\) (ottenendo così un numero di blocchi interi). Cifriamo poi ciascun blocco nel seguente modo: la \(i\) -esima lettera del blocco (che ne contiene \(s\)), viene cifrata tramite l'\(i\) esimo alfabeto, o tramite la \(i\) -esima regola.

Storicamente, i cifrari polialfabetici fuorno ideati inizialmente \(1500\) CE da Leon Battista Alberti. L'idea fu poi ripresa e migliorata da Vigénere nel \(1600\), che definì uno schema di cifratura che utilizzava \(26\) cifrari diversi, al posto dei \(2\) utilizzati da Alberti.

Possiamo ritrovare questa idea di base nel Cifrario di Hill, che formalizza il tutto tramite l'algebra lineare.


4.1 Cifrario di Hill

Il Cifrario di Hill è un cifrario a sostituzione polialfabetica, basato sull'algebera lineare.

Supponiamo di voler inviare un messaggio utilizzando questo cifrario. Iniziamo spezzando il messaggio da cifrare in blocchi di lunghezza \(k\). Al posto di cifrare le singole lettere, vogliamo cifrare le \(k\) -uple di lettere insieme, che prendono il nome di k-grafi. L'idea, descritta nella sezione precedente, è di cifrare la \(i\) -esima lettera di un blocco, utilizzando l'\(i\) -esima regola dello schema.

Sia \(P\) un vettore colonna rappresentante un blocco unitario di un messaggio. Un messaggio sarà quindi formato da più blocchi unitari. Sia poi \(C\) un vettore colonna rappresentate un blocco unitario del messaggio cifrato. Infine, sia \(A\) una matrice \(k \times k\) a coefficienti in \(\mathbb{Z}_N\), e sia \(b\) un vettore colonna con elementi in \(\mathbb{Z}_N\). La matrice \(A\) e il coefficiente \(b\) codificano le \(k\) regole utilizzate nella cifratatura: la \(i\) esima riga di \(A\) e l'\(i\) -esimo componente di \(b\) vengono utilizzati per cifrare la \(i\) -esima lettera del blocco unitario di testo. Proprio per il fatto che potenzialmente le righe di \(A\) e le componenti di \(b\) potrebbero essere diverse, ovvero che potremmo utilizzare più regole per cifrare le lettere, questo cifrario è un cifrario polialfabetico.

Il cifrario di Hill funziona nel seguente modo:

  • La chiave di cifratura è formata dalla matrice \(A\) e dal vettore colonna \(\underline{b}\), \(k_c = (A, \underline{b})\). L'operazione di cifratura è definita nel seguente modo:

    \[C = A \cdot P + b \mod N\]

    Ovvero,

    \[\begin{pmatrix}c_1\\c_2\\...\\c_k\end{pmatrix} = \begin{pmatrix}a_{11} & a_{12} & ... & a_{1k}\\a_{21} & a_{22} & ... & a_{2k}\\...\\a_{k1} & a_{k2} & ... & a_{kk}\end{pmatrix} \cdot \begin{pmatrix}p_1\\p_2\\...\\p_k\end{pmatrix} + \begin{pmatrix}b_1\\b_2\\...\\b_k\end{pmatrix} \mod N\]

  • La chiave di decifratura invece è data da \(k_d = (A^{-1}, -b)\). L'operazione inversa, quella di decifratura, invece è definita da

    \[P = A^{-1}(C - B) \mod N\]

Questo sistema generalizza tutti quelli visti fin'ora. Infatti se \(k = 1\), allora otteniamo i soliti cifrari affini (che a loro volta generalizzavano il cifrario di cesare).

Notiamo infine che, per fare in modo che l'operazione di decifratura sia correttamente definita, dobbiamo richiedere che la matrice \(A\) sia invertibile. Andiamo a vedere questo che implica, considerando il fatto che in generale \(N\) non è primo, e quindi i coefficienti di \(A\) non vengono presi da un campo, ma in un anello.


4.1.1 Inversa di una Matrice a Coefficienti in un Anello

Per i cifrari di Hill è necessario che la matrice utilizzata per cifrare sia invertibile. Ricordiamo che una matrice \(A\) è invertibile, se esiste un'altra matrice \(B\) tale che

\[AB = BA = I\]

dove \(I\) rappresenta la matrice identica (quella con tutti \(1\) nella diagonale e \(0\) nel resto). La matrice \(B\) viene poi rappresentata con il simbolo \(A^{-1}\), per rappresentare che è l'inversa di \(A\).

Un teorema ben noto dell'algebra lineare afferma come condizione necessaria e sufficiente all'esistenza della matrice inversa il fatto che il determinate della matrice sia diverso da \(0\), ovvero

\[\textit{$A$ è invertibile $\iff$ $det(A) \neq 0$}\]

Questo è vero quando gli elementi di \(A\) fanno parte di un campo. Nel nostro caso però, gli elementi di \(A\) fanno parte di un anello, e quindi per l'esistenza dell'inversa non ci basta più che \(det(A) \neq 0\). In particolare abbiamo il seguente risultato:

Teorema: Sia \(A\) una matrice \(k \times k\) a coefficienti in \(\mathbb{Z}_n\). Le seguenti proposizioni sono equivalenti.

  1. \(MCD(det(A), n) = 1\)

  2. \(A\) è invertibile

  3. Esiste \(\varphi_{A}: \mathbb{Z}_n^k \to \mathbb{Z}_n^k\), con

    \[\varphi_{A}(\underline{x}) := A \cdot \underline{x} \mod n\]

    tale che \(\varphi_{A}\) è biiettiva.

  4. \(A \cdot \underline{x} = 0 \iff \underline{x} = 0 \mod n\)

Dimostrazione: Procediamo per punti

  • \((1) \implies (2)\)

    Se \(det(A)\) è coprimo con \(n\), allora possiamo calcolare \(det(A)^{-1}\) in \(\mathbb{Z}_n\), e quindi anche

    \[A^{-1} = det(A)^{-1} \cdot agg(A)\]

    dove \(agg(A)\) è la matrice aggiunta di \(A\), i cui elementi sono i complementi algebrici dei corrispondenti elementi della trasporta di \(A\). Ma allora \(A\) è invertibile.


  • \((2) \implies (4)\)

    Notiamo che

    \[\begin{split} A \cdot \underline{x} = 0 &\iff (A^{-1}A) \cdot \underline{x} = A^{-1} \cdot 0 \\ &\iff I \cdot \underline{x} = 0 \\ &\iff \underline{x} = 0 \end{split}\]


  • \((3) \iff (4)\)

    Infatti, se vale \((4)\), allora il nucleo di \(\varphi_A\) è composto da un solo elemento, e quindi la \(\varphi_A\) è iniettiva, ovvero vale la \((3)\). Infatti, dati \(a, b \in \mathbb{Z}_n\), e notando che \(\varphi_A\) è una funzione lineare, si ha che

    \[\begin{split} \varphi_A(a) = \varphi_A(b) &\iff \varphi_A(a) - \varphi_A(b) = 0 \\ &\iff \varphi_A(a - b) = 0 \\ &\iff a - b = 0\\ &\iff a = b \end{split}\]

    Viceversa, se vale la \((3)\) allora \(\varphi_A\) è iniettiva. Ma allora il nucleo è composto solo da \(0\), ovvero vale la \((4)\).


  • \((4) \implies (1)\)

    Sia \(m := MCD(det(A), n) \leq n\), e sia \(m' := \frac{n}{m}\).

    Supponendo che tutte le entrate di \(A\) siano divisibili per \(m\) otteniamo

    \[A \cdot \begin{pmatrix} m' \\ m' \\ .\\ . \\ m' \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ . \\ . \\ 0 \end{pmatrix} \mod n\]

    Ora, se \(m = n\), allora \(m' = 1\), e quindi

    \[\begin{pmatrix} m' \\ m' \\ . \\ . \\ m' \end{pmatrix} = \begin{pmatrix} 1 \\ 1 \\ . \\ . \\ 1 \end{pmatrix} \mod n\]

    Il che non può essere vero, in quanto è vera la \((4)\). Se invece \(1 \leq m < n\) allora l'unico valore possibile per \(m\) è proprio \(1\). Infatti, se \(1 < m < n\), allora \(1 < m' < n\) e nuovamente la verita di \((4)\) mi fa cadere in contraddizione. Dunque \(m=1\) e quindi in questo caso vale \((1)\).

    Supponiamo adesso che esista qualche entrata di \(A\) che non sia divisibile per \(m\). In particolare possiamo assumere, senza perdita di generalità, che nella prima riga vi sia qualche entrata non divisibile per \(m\). In questo caso otteniamo

    \[A \cdot \begin{pmatrix} m' \cdot A_{11} \\ m' \cdot A_{12} \\ \vdots \\ m' \cdot A_{1k} \end{pmatrix} = \begin{pmatrix} m' \cdot det(A) \\ 0 \\ \vdots \\ 0 \end{pmatrix} \mod n\]

    Infatti, dalla prima riga di \(A\) otteniamo

    \[m'(a_{11}A_{11} + a_{12}A_{12} + \ldots + A_{1k}A_{1k}) = m' \cdot det(A)\]

    invece, per le restanti righe di \(A\), con \(i \neq 1\), otteniamo

    \[m'(a_{i1}A_{11} + a_{i2}A_{12} + \ldots + A_{ik}A_{1k}) = m' \cdot 0 = 0\]

    ricordiamo adesso che

    \[m' \cdot det(A) = \frac{n}{m} \cdot det(A) = n \cdot \Big(\frac{det(A)}{m}\Big)\]

    e quindi \(m' \cdot det(A) \equiv 0 \mod n\). Sapendo poi che la \((4)\) è vera otteniamo

    \[\begin{pmatrix} m'A_{11} \\ m'A_{12} \\ \vdots \\ m'A_{1k} \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ \vdots \\ 0 \end{pmatrix} \mod n\]

    il che equivale a dire

    \[\begin{cases} n \,\,|\,\, m'A_{11} \\ n \,\,|\,\, m'A_{12} \\ \,\,\,\, \vdots \\ n \,\,|\,\, m'A_{1k} \\ \end{cases}\]

    Ora, dato che \(m' \cdot A_{1,j} = \frac{n}{m} \cdot A_{1, j}\), il fatto che \(n\) divide \(m' \cdot A_{1, j}\) equivale a dire che esiste un certo \(h\) tale che

    \[m' \cdot A_{1, j} = h \cdot n \iff \frac{n}{m} \cdot A_{1, j} = h \cdot n \iff A_{1, j} = h \cdot m\]

    ovvero che \(m\) divide \(A_{i, j}\), per ogni \(J = 1, \ldots, k\). Questo fatto va in contraddizione con l'assunzione che avevamo fatto inizialmente: il fatto che non tutti gli elementi della prima riga di \(A\) sono divisibili per \(m\). Infatti, se vale l'ipotesi, ovvero se esiste un qualche elemento della prima di \(A\) che non è divisible per \(m\), allora deve esistere anche un complemento algebrico corrispondente ad un elemento della prima riga di \(A\) che non è divisibile per \(m\).

\[\tag*{$\blacksquare$}\]



4.1.2 Esempio di Utilizzo

Supponiamo di voler utilizzare il cifrario di Hill con \(k = 2\) e la chiave per cifrare \(k_c = (A, b)\) tale che

\[A = \begin{pmatrix} 1 & 2 \\ 4 & 3 \end{pmatrix} \quad ,\quad b = 0 = \begin{pmatrix} 0 \\ 0 \end{pmatrix}\]

La trasformazione per passare da un testo in chiaro \(P = \begin{pmatrix} p_1 \\ p_2 \end{pmatrix}\) ad un testo cifrato è quindi la seguente

\[C = \begin{pmatrix} c_1 \\ c_2 \end{pmatrix} = \begin{pmatrix} 1 & 2 \\ 4 & 3 \end{pmatrix} \begin{pmatrix} p_1 \\ p_2 \end{pmatrix} + 0 = \begin{pmatrix} p_1 + 2p_2 \\ 4p_1 + 3p_2\end{pmatrix}\]

Ad esempio, se ho il testo \(\text{YO}\), prendendo gli equivalenti numerici ottengo il vettore \(P = \begin{pmatrix} 24 \\ 14\end{pmatrix}\) e applicando la trasformazione ottengo

\[C = \begin{pmatrix} 24 + 2 \cdot 14 \\ 4 \cdot 24 + 3 \cdot 14\end{pmatrix} = \begin{pmatrix} 0 \\ 8\end{pmatrix}\]

Sostituendo gli equivalenti numerici con le lettere dell'alfabeto infine ottengo il testo \(\text{AI}\).

5 Crittoanalisi

La crittoanalisi formalmente consiste nel decifrare del testo cifrato senza essere a conoscenza della chiave di cifratura utilizzata per cifrare il testo.

Quando si fa crittoanalisi quindi bisogna cercare di trovare le falle e le vulnerabilità degli schemi di cifrazione in modo tale da romperli e avere accesso ad informazioni in un primo momento inaccessibili.

Segue un esempio per comprendere meglio uno scenario tipico che dobbiamo risolvere quando facciamo crittoanalisi.


5.1 Esempio: Sistemi Lineari in \(\mathbb{Z}_{26}\)

Supponiamo di voler risolvere il seguente sistema lineare

\[\begin{cases} x + 3y \equiv 1 \mod 26 \\ 7x + 9y \equiv 2 \mod 26 \end{cases}\]

Avendo lo stesso modulo in entrambe le equazioni, questa volta non possiamo applicare il teorema dei resti cinese. Siamo quindi costretti a risolverlo con metodi meno diretti. Iniziamo formalizzando il tutto tramite l'algebra lineare.

Il sistema può essere espresso nel seguente modo:

\[ P = \begin{pmatrix} 1 \\ 2 \end{pmatrix} = \begin{pmatrix} 1 & 3 \\ 7 & 9 \\ \end{pmatrix} \cdot \begin{pmatrix} x \\ y \end{pmatrix} \mod 26\]

notiamo poi che

\[det \begin{pmatrix} 1 & 3 \\ 7 & 9 \\ \end{pmatrix} = 3 - 21 = -12\]

e quindi \(MCD(det(P), 26) = MCD(-12, 26) = 2\). In altre parole, non possiamo invertire la matrice. Osserviamo però il fatto che tutte le soluzioni del sistema modulo \(26\) sono anche soluzioni modulo \(13\) per lo stesso sistema, in quanto \(26\) è un multiplo di \(13\).

L'idea è quindi di risolvere il sistema modulo \(13\), che per costruzione ha una sola soluzione modulo \(13\). Partendo dalla singola soluzione poi generiamo tutte le soluzioni che sono congrue modulo \(13\) ma non \(26\), e testiamo ciascuna nel sistema modulo \(26\). Se non troviamo nessuna soluzione, allora il sistema non ha soluzioni.

Notiamo che l'inversa di \(P\) modulo \(13\) è la matrice

\[P^{-1} = \begin{pmatrix} 9 & -3 \\ -7 & 1 \end{pmatrix} \mod 13\]

La soluzione del sistema modulo 13 è quindi

\[\begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 9 & -3 \\ -7 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} 1 \\ 2 \end{pmatrix} = \begin{pmatrix} 3 \\ -5 \end{pmatrix}\]

a partire da questa possiamo generare tutte le soluzioni congrue modulo \(13\) ma non modulo \(26\) per ottenere

\[\begin{pmatrix} 3 \\ -5 \end{pmatrix}, \begin{pmatrix} 16 \\ -5 \end{pmatrix}, \begin{pmatrix} 3 \\ 8 \end{pmatrix}, \begin{pmatrix} 16 \\ 8 \end{pmatrix}\]

Alla fine si può verificare che nessuna di queste risulta essere una soluzione del sistema modulo \(26\), il che vuol dire che il sistema non ha soluzioni modulo \(26\).