Crittanalisi - Parametri statistici
Le presenze in un testo cifrato
Kappa

LinguaBA
cifre10.010
Dansk24.529
Deutsch21.226
English21.226
Espanol21.026
Francais20.026
Italiano20.526
Italiano XVI sec19.022
Latino19.020
Nederlands21.026
Portugues21.026
????????21.026
???????26.532

Un indicatore molto utile per decidere se un testo cifrato è monoalfabetico o polialfabetico è il numero $p$ di presenze e cioè il numero di caratteri diversi che compaiono nel testo; ovviamente $p$ è sempre minore o uguale al numero $A$ di lettere dell'alfabeto usato e così pure rispetto al numero $N$ di lettere del testo.

Questo numero dipende da $N$, si avvicina sempre più a un valore limite $B$ al crescere di $N$, con un andamento asintotico simile a quello della funzione arcotangente. Una formula empirica che approssima bene il numero di presenze previste è quella riportata dal Sacco(*):

$$ p(N) = \frac{2B}{\pi} \arctan \left(\frac{\pi}{2} \times \frac{N}{A} \right)$$

dove $B$ è una costante caratteristica della lingua usata (vedi tabella a lato) e l'arcotangente è calcolato in radianti.

Per calcolare $p$ si può usare la finestra qui sotto; è anche possibile osservare la differenza tra presenze osservate e presenze attese alla pagina Diagramma delle presenze di un testo.


grafico
Lingua: numero di lettere del testo

Presenze attese = 19.128633799349

Il grafico accanto mostra, in rosso, l'andamento della funzione $p(N)$ per un cifrario monoalfabetico, e quello, in verde, di un cifrario polialfabetico dove il numero di presenze è molto più alto e si avvicina al massimo teorico $A$ già per valori piccoli. Per i polialfabetici ho usato la funzione $q(N)$ ricavata empiricamente dall'analisi di diversi spezzoni di cifrati polialfabetici:

$$ q(N) = \frac{2A}{\pi} \arctan \left(\frac{2N}{A} \right)$$

Questa differenza si basa sul fatto che in ogni lingua ci sono lettere dalla frequenza bassissima, quasi nulla; in italiano J K W X Y sono rarissime e presenti quasi esclusivamente in parole straniere; in francese sono rarissime solo K W; in tedesco Q X Y, in inglese J Q, in spagnolo K W X. Insomma va tenuto conto che questa differenza è massima per la lingua italiana!

Ne segue che se un testo cifrato ha un numero di presenze prossimo a quello previsto con i valori di $p(N)$ si tratta quasi sicuramente di un monoalfabetico, mentre se tale numero è sensibilmente superiore a tale valore è probabile che si tratti di un cifrario polialfabetico o comunque di un cifrario più compesso (p.es. con omofoni ma in questo caso il numero di simboli $A$ dovrebbe essere superiore al consueto).

Per testi cifrati molto lunghi la differenza tra il valore previsto per i monoalfabetici e i polialfabetici diventa molto piccola e poco significativa. Allora conviene spezzare il testo in tratti di 30 lettere ciascuno ed analizzarne qualcuno con il criterio appena ricordato. In tal modo è ancora possibile distinguere un cifrario monoalfabetico da un polialfabetico.

La funzione $p(N)$ è utile anche per individuare la lunghezza del verme nei cifrari polialfabetici come il Vigenere. Si veda per esempio il metodo dei minimi quadrati per la crittanalisi del Vigenere.

Riferimenti bibliografici
X Nel Manuale di Crittografia il Sacco usa una formula con l'arcontangente calcolato in gradi; ho preferito riscriverla in funzione dei radianti considerato che oggi molti software matematici/statistici usano il radiante come unità di default, e che comunque non ci sono più difficoltà ad usare i radianti.