Ahoj, jdu prosit o radu jak reverznout výpočet kontrolní číslice...
Mám nějaký kontrolní součet a neznám způsob, jak se počítá.
Jedná se o něco jako je kontrolní číslice v EAN, výpočet je zřejmě velmi podobný.
V PHP používám na ean tohle:
$number = strrev('12345');
$total = 0;
for ($i = 0, $max = strlen($number); $i < $max; $i++) {
if (($i % 2) == 0) {
$total += ($number[$i] * 3);
} else {
$total += $number[$i];
}
}
$mod = ($total % 10);
$calculated_checksum = (10 - $mod) % 10;
Neplatí omezení na 8/12 znaků, takže třeba pro 12345 je kontrolní číslice 7, pro 54 je to 3. (v případě EAN)
Příklad reálných vstupů a výstupů o které mi jde:
vstup | checksum
003 | 3
009 | 9
012 | 3
024 | 2
054 | 1
Podle prvních dvou se zdá, že není využíváno připočtení pozice aktuální číslice (jako to má např. Code128) tedy jsou to případy, kdy je dělitel vyšší, než vstup a výstupem je tedy stejné číslo jako na vstupu. Pokud by byly pozice připočítány, můžou být až 4, ale nezdá se mi to ani možné.
Vyzkoušel bruteforcovat jsem statisíce variant s růhnými změnami ve výše uvedené funkci. Násobení sudých čísel 2-100, konečné dělení do 103, připočtení 0-500 ke konečnému výsledku a spoustu podobných variant.
Neúspěšně samozřejmě... Tam může být úplně cokoli random.
Jak to řešit lépe, než hloupým bruteforce?