Frekvenční analýza

Kapitoly: Kryptografie, Frekvenční analýza

Frekvenční analýza je obecný postup, který lze použít během luštění několika různých druhů šifer. Ve frekvenční analýze typicky procházíme šifrový text a snažíme se najít nějaké podobnosti s jazykem, ve kterém je zpráva psaná.

Četnost písmen v českém textu

Jedním ze základních prostředků frekvenční analýzy je četnost znaků v daném jazyku. Pokud analyzujeme dostatečné množství českého textu, můžeme spočítat různé statistické informace, včetně toho, kolikrát se v těchto textech vyskytovala jaká písmena.

Protože jsem onehdá na uložto zakoupil asi pět tisíc česky psaných knih, provedl jsem nad nimi takovou analýzu. V těch pěti tisíc knihách se celkem vyskytovalo 1 404 443 151 písmen. Rozložení písmen (po odstranění diakritiky) ukazuje následující tabulka:

PísmenoPočet výskytůPísmenoPočet výskytů
a134 675 829n83 104 322
b24 944 593o112 776 769
c42 120 335p43 747 863
d53 015 496q83 322
e153 141 622r61 750 942
f2 458 624s78 451 777
g3 087 128t75 633 324
h35 075 708u50 265 458
i93 903 002v55 510 103
j32 383 080w762 129
k49 549 907x504 334
l80 345 129y40 132 126
m50 636 489z46 383 740

Následující tabulka pak ukazuje relativní četnost písmen:

PísmenoRelativní četnostPísmenoRelativní četnost
a0.09589269n0.05917244
b0.0177612o0.08029999
c0.02999077p0.03114961
d0.03774841q0.00005933
e0.10904081r0.04396827
f0.0017506s0.0558597
g0.00219812t0.05385289
h0.02497482u0.03579031
i0.06686138v0.03952464
j0.02305759w0.00054266
k0.03528082x0.0003591
l0.05720782y0.02857512
m0.0360545z0.03302643

Tabulka tak říká, že přibližně 9,58 % písmen ve všech knihách bylo písmeno „a“. Odtud můžeme odvodit, že v běžném českém textu bude přibližně 9,58 % písmen právě „a“.

Každá taková statistika bude ukazovat trochu jiné hodnoty, ale to nevadí — nejde ani tak o přesné hodnoty, ty stejně nejde zjistit, stačí přibližné hodnoty.

Odchylka četnosti písmen od četnosti písmen v jazyku

Známe-li očekávané relativní četnosti jednotlivých písmen v daném jazyku, můžeme spočítat odchylku nějakého textu od očekávaných hodnot. Pro příklad si vezměmě dva texty: „fhes dudy fqhup ijhecuc fhejepu eriqxkzu ahkpdysu“ a „proc neni parez stromem protoze obsahuje kruznice“. Na první pohled vidíme, že první text je nějaká hatlamatlatilka, zatímco druhá věta je český text. Spočítáme si odchylku — měla by vyjít tak, že odchylka prvního textu bude zásadně vyšší než druhého.

Nejprve si spočítáme výskyty písmen v jednotlivých textech:

PísmenoPočet písmenRelativní četnost
První textDruhý textPrvní textDruhý textČeský jazyk
a120.023260.046510.09589
b0100.023260.01776
c220.046510.046510.02999
d300.0697700.03775
e560.116280.139530.10904
f300.0697700.00175
g00000.0022
h510.116280.023260.02497
i220.046510.046510.06686
j210.046510.023260.02306
k210.046510.023260.03528
l00000.05721
m0200.046510.03605
n0300.069770.05917
o0500.116280.0803
p330.069770.069770.03115
q200.0465100.00006
r150.023260.116280.04397
s220.046510.046510.05586
t0200.046510.05385
u620.139530.046510.03579
v00000.03952
w00000.00054
x100.0232600.00036
y200.0465100.02858
z130.023260.069770.03303

Nyní vypočítáme odchylky. Ty vypočítáme tak, že odečteme relativní četnost písmene v jazyku od relativní četnosti v prvním textu a umocníme na druhou. Tzn., že pro písmeno „a“ a první text bychom odchylku získali jako

$$ (0.0232558 - 0.0958927)^2=0.0052761 $$

a podobně pro všechny ostatní písmena. Pokud myší najedete na buňku s výsledkem, zobrazí se i výraz, tkerým se k výsledku došlo.

Relativní četnostOdchylka
1. text2. textČeský jazyk1. text2. text
a0.023260.046510.095890.00527610.0024385
b00.02325580.01776120.00031550.0000302
c0.04651160.04651160.02999080.00027290.0002729
d0.069767400.03774840.00102520.0014249
e0.11627910.13953490.10904080.00005240.0009299
f0.069767400.00175060.00462630.0000031
g000.00219810.00000480.0000048
h0.11627910.02325580.02497480.00833650.000003
i0.04651160.04651160.06686140.00041410.0004141
j0.04651160.02325580.02305760.00055010
k0.04651160.02325580.03528080.00012610.0001446
l000.05720780.00327270.0032727
m00.04651160.03605450.00129990.0001094
n00.06976740.05917240.00350140.0001123
o00.11627910.08030.00644810.0012945
p0.06976740.06976740.03114960.00149130.0014913
q0.046511600.00005930.00215780
r0.02325580.11627910.04396830.0004290.0052289
s0.04651160.04651160.05585970.00008740.0000874
t00.04651160.05385290.00290010.0000539
u0.13953490.04651160.03579030.01076290.0001149
v000.03952460.00156220.0015622
w000.00054273e-73e-7
x0.023255800.00035910.00052431e-7
y0.046511600.02857510.00032170.0008165
z0.02325580.06976740.03302640.00009550.0013499
0.05585460.0211603

Nakonec jsme všechny odchylky sečetly. Správně bychom ještě měli tuto hodnotu vydělit počtem písmen a následně odmocnit, abychom opravdu dostali odchylku. Ale tyto operace už nic nezmění na tom, že druhý text má odchylku výrazně nižší, takže je s mnohem větší pravděpodobností text českého jazyka.

Nejčastější slova jazyka

Občas se může hodit i seznam nejčastějších slov jazyka.

SlovoVýskytůSlovoVýskytůSlovoVýskytůSlovoVýskytů
jsem2 516 782tady286 606rekla203 656snad163 296
jako1 321 843dobre273 130zeptal201 509ruce161 382
kdyz1 237 411chvili269 045mela199 285taky161 174
jeho974 131vsechno268 277pokud197 778videl160 506
bylo689 849jestli262 429takze193 357prece160 228
byla657 760proc262 226pane193 123prilis156 839
rekl644 137nikdy260 096vsechny192 988misto156 221
jeste608 371mohl259 919vsichni185 965kterou155 250
jsme549 840byly255 072potom183 655zase154 924
ktery522 587mezi253 466vubec179 968dost154 784
nebo489 592kolem251 146svou178 390nekolik154 165
ktere483 800tomu243 646rychle175 422hlavou153 777
pred460 548znovu235 604trochu174 553abych153 655
neco448 947mozna235 161stale174 451podle151 450
toho446 667prave233 467sebou173 820zacal151 309
bude412 128muze227 622jenom172 716clovek149 240
jste394 867take224 705kteri172 342chtel148 978
jsou376 431dalsi221 056lidi169 569proti148 603
jejich331 235stejne218 216tohle167 825nebyl147 829
neni318 782kdyby217 917nekdo165 736velmi145 921
bych304 981sebe211 148prvni164 858dvere141 094
protoze302 978nich210 384proto164 817veci140 673
vsak301 623jeden208 864tedy164 637vedel140 656
ktera295 817byli206 830nikdo164 442myslim139 935
jeji288 095pres205 040sveho163 638nebylo136 314