Nevim, jak to je udelane, ale kdybych to navrhoval ja, tak by to vypadalo takto.
Cislo karty by se skladalo rekneme z 13 cislic.
Prvnich 8 by bylo cislo kuponu (ta by mohla klidne jit po sobe), dalsi 4 by bylo neco jako PIN, ktery by nebyl generovan nejakym algoritmem, ale ciste nahodne a pak posledni doplnkove cislo, pomoci ktereho by bylo mozne na prvni pohled (bez slozitych matematickych operaci) poznat, zda cely kod neni nejak poskozen - napr. delitelnost 11 jako je to u rodneho cisla.
No a pri dobijeni se nejdrive zkontroluje ta delitelnost 11 (aby se zbytecne nepretezoval server pozadavky na verifikaci) a v pripade, ze to projde, tak se dotaze centralni databaze, kde jsou vsechna cisla ulozena, jestli to souhlasi. Teprve potom se dobije.
Pak by jakykoliv generator ztracel smysl. Sice by mohl napodobit to cislo tim, ze by bylo delitelne 11, takze by se uzivatel "probojoval" az k dotazu na centralni databazi, ale tam by byl odmitnut s tim, ze nesouhlasi PIN. Pokud by ovsem nemel stesti 1:10 000 a ten PIN neuhodl.
To je samozrejme zaklad. Je mozne to trochu ztizit tim, ze se ta PIN cisla "rozhazi" mezi cislo karty takze to nebude format 8 + 4 + 1, ale PIN cislo bude treba 3., 5., 7., a 9. cislo a to ktere zajistuje delitelnost 11 take nemusi byt na konci, ale muze byt na zacatku nebo uprostred. Rovnez ta prvotni verifikace nemusi byt na principu delitelnosti 11 ale na nejakem jinem - potom by samozrejme zalezelo na operatorovi, jak vykonny pocitac by k tomu priradil - a podle toho zvolit ten verifikacni algoritmus (napr. ze cislo pro 400 Kc kupon musi zacinat devitkou a nesmi obsahovat nulu, ... aby pocitac rovnou vedel do jake casti databaze se ma po verifikaci podivat a nemusel ji prohledavat celou, nebo ze soucasti cisla kuponu je den kdy bylo vygenerovano, atd.)
Napadla me pouze 2 slaba mista:
1. V pocitacovem svete v podstate neexistuji nahodna cisla - v ruznych vyzkumech, kde je potrebuji sestrojuji spozite (a drahe) pristroje ktere se je snazi generovat na fyzikalni bazi. Takze mohl by se najit nejaky liny programator - ignorant, ktery by je proste nechal generovat z toho poradoveho cisla kuponu, ten algoritmus, kdyby nekdo zjistil, tak by mel vyhrano. Ale nemel by byt problem generovat je s pomoci data a casu na pocitaci. Hlavne toho casu s presnosti treba na setiny sekundy. Protoze to by nekdo asi tezko zjistil s takovou presnosti, kdy bylo cislo generovano - pokud by to nebylo vytisteno primo na karte
No a 2. moznost je "vlomeni se" do databaze a ukradnuti cisel. Ale to by mel operator vcas zpozorovat a cisla zablokovat, nez by dosel nejake vyznamnejsi ujmy.