Hlavní obsah

Otestoval jsem 7,2 milionu změn jedné číslice. Luhn je odhalil všechny

Foto: Pexels

Na 50 000 syntetických 16místných číslech jsem změnil každou pozici na všech devět jiných číslic. Luhn nezmeškal ani jednu; u 09↔90 už má slabinu.

Článek

Kontrolní číslice na platební kartě nevypadá nijak chytře. Přesto za ní stojí jednoduchá matematika, která umí odhalit překvapivě velkou skupinu obyčejných chyb při přepisu. Pro tento článek jsem připravil reprodukovatelný test na 50 000 syntetických 16místných čísel vyhovujících Luhnovu algoritmu.

Pak jsem na každé z 16 pozic postupně dosadil všech devět jiných číslic. Výsledek: 7 200 000 jednociferných změn a 0 případů, které by po změně zůstaly Luhnově platné. To neznamená, že algoritmus ověřuje skutečnou kartu. Znamená to přesně to, co má: změnu jedné číslice v tomto testu nepustil.

Jak vzniklo přesně 7,2 milionu testů

Nepracoval jsem se skutečnými ani vydanými čísly karet. Skript vytvořil vždy 15 náhodných číslic a dopočítal šestnáctou tak, aby celá řada splnila Luhnův kontrolní součet. Použil jsem pevný seed 20261006, takže lze stejný soubor testů znovu vytvořit.

U každého z 50 000 čísel jsem vzal všech 16 pozic. Původní číslici jsem na daném místě nahradil postupně všemi devíti ostatními možnostmi. Počet pokusů je tedy 50 000 × 16 × 9 = 7 200 000.

Co Luhn vlastně počítá

Princip je starý a záměrně jednoduchý. Při kontrole se od pravé strany každá druhá číslice zdvojnásobí; pokud výsledek přesáhne 9, odečte se 9. Upravené a neupravené číslice se sečtou. Jestli je součet dělitelný deseti, řada kontrolou projde.

Smyslem není kryptografie. Luhn je kontrolní součet - levná pojistka proti běžnému překlepu nebo chybě při zadávání. Stripe jej popisuje právě jako mechanismus pro validaci identifikačních čísel včetně čísel platebních karet.

Jedna číslice bez chyby. Sousední prohození už má slabinu

Druhá část testu byla zajímavější. U stejných 50 000 řad jsem prohodil každou dvojici sousedních, navzájem odlišných číslic. Takových skutečných změn vzniklo 675 377.

Luhn z nich 15 091 neodhalil, tedy přibližně 2,23 % v tomto vzorku. Všechny neodhalené případy měly stejný vzor: záměnu 09 za 90 nebo 90 za 09. To je pěkná ukázka rozdílu mezi tvrzením „odhalí každou změnu jedné číslice“ a mnohem silnějším, ale nepravdivým „odhalí každý možný překlep“.

Luhnově platné neznamená existující ani bezpečné

Tady je potřeba zabrzdit dřív, než se z kontrolního součtu stane kouzelný detektor karet. Syntetická 16místná řada může matematicky projít Luhnem a přitom nemusí být nikomu vydaná. Algoritmus nekontroluje účet, banku, stav karty, datum expirace, CVC ani oprávnění k platbě.

Jeho síla je mnohem skromnější a právě proto užitečná: dokáže rychle vyhodit řadu, která má špatnou kontrolní strukturu. Teprve další systémy řeší, zda číslo odpovídá skutečnému platebnímu prostředku a zda je transakce povolená.

Sedm milionů pokusů potvrzuje vlastnost, ne bezpečnost systému

Nula neodhalených jednociferných změn v 7,2 milionu pokusů je pěkný výsledek, ale není to důkaz „bezpečnosti karet“. Je to praktická demonstrace známé vlastnosti jednoduchého checksumu na konkrétním reprodukovatelném vzorku.

A doplňkový test sousedních záměn zároveň ukazuje, proč se vyplatí psát přesně. Luhn je výborný hlídač jedné změněné číslice. Jakmile začneme mluvit o všech chybách, jeho jistota končí.

Zdroje

Máte na tohle téma jiný názor? Napište o něm vlastní článek.

Texty jsou tvořeny uživateli a nepodléhají procesu korektury. Pokud najdete chybu nebo nepřesnost, prosíme, pošlete nám ji na medium.chyby@firma.seznam.cz.

Sdílejte s lidmi své příběhy

Stačí mít účet na Seznamu a můžete začít publikovat svůj obsah. To nejlepší se může zobrazit i na hlavní stránce Seznam.cz