Crittanalisi - Parametri statistici
Le presenze in un testo cifrato
Kappa

LinguaBA
_Epigrafe26
Caratteri ASCI 96.026
cifre10.010
Crypto26
Dansk24.529
Deutsch21.226
English21.226
Espanol21.026
Francais20.026
Greco Tucidite22.026
Italiano20.526
Italiano XVI sec. maius.19.022
Italiano XVI sec. minus.19.022
Italiano XVI sec. numeri e minus19.022
Latino antico19.020
Latino moderno 2219.026
Nederlands21.026
Portugues21.026
Ελληνικα22.024
Ελληνικα antico spaziato22.025
Ελληνικα moderno22.026
Русский (Russo)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 = 18.359241839802

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.