<< >>

Výběr čísla bankovního účtu na přání

Včera jsem si u Fio banky chtěl založit svůj druhý běžný bankovní účet, tento však v eurech. Procházel jsem si informace na stránkách Fio, když jsem náhle narazil na odstavec, kde se psalo o číslech na přání. Říkal jsem si, že by bylo cool, kdyby se číslo mého druhého účtu lišilo třeba jen v prvních několika číslech.

Podmínky Fio banky:

Číslo účtu si můžete vybrat u všech nových osobních i podnikatelských účtů, které jsou zakládány na pobočce a u kterých dosud neproběhla žádná operace.

Číslo musí splňovat následující podmínky:

  • Nesmí být obsazené jiným klientem
  • Musí obsahovat 8 až 10 číslic
  • Desetimístné číslo účtu nesmí začínat čísly 1 nebo 2, devítimístné nesmí začínat čísly 9 nebo 19
  • Musí vyhovovat podmínkám České národní banky a splňovat formát Modulo 11 - na webu ČNB si můžete ověřit, jestli vaše vybrané číslo tento formát splňuje

První pokusy

Nejprve mě samozřejmě napadlo kombinace zkoušet ručně. Netrvalo dlouho a bylo mi jasné, že tato cesta nikam nepovede. Systém je vytvořen právě tak, aby nebylo možné, jen tak omylem změnit jedno číslo, a výsledkem bylo validní číslo účtu.

Musíme napsat program

Na webu ČNB, kde je validátor IBAN, jsem lehce nalezl funkci, která validuje formát Modulo 11. Pokud ji využijeme, ušetříme si práci, ale hlavně odpadne možnost chybné implementace. Vypadá takto:

function test_num(CI){
  var ret="N"; //N-cislo0,C-cislo,E-chyba
  var vahy = new Array("1","2","4","8","5","10","9","7","3","6");
  var suma = 0;
  var len=CI.length;
  var j=0;
  for (var i=len-1; i>=0; i--){
    c=CI.charAt(i);
    if (c == 0){
    }else{
      if (c >= '1' && c <= '9'){
        ret="C";
        suma=suma+c*vahy[j];
      }else{
        ret="E";
        break;
      }
    }
    j++;
  }
  if ((suma % 11)==0){ret=ret+"M"}else{ret=ret+"E"};

  return ret;
}

Když máme validační funkci, můžeme jednoduše generovat všechny kobinace, které pro nás přicházejí v úvahu a nechat si vypsat validní čísla účtu. Dává smysl měnit například první nebo poslední dvojčíslí.

Níže už je připravený formulář, kde si vygenerování podobných čísel mohou zkusit i neprogramátoři.

Generuj podobná čísla

Správnost si můžete ověřit na webu ČNB. Do kolonky Druhá část čísla účtu zadejte číslo, do kolonky Kód banky banku (např. 2010) a klikněte na IBAN. Pokud je vše správně, vypíše se IBAN. Pokd není, vypíše se Chybné číslo účtu a dále Číslo není modulo 11.

Pokud číslo vyhovuje také požadavkům konkrétní banky, můžete vyrazit.

Jak je to s IBAN

Pokud nové číslo vložíte do IBAN svého starého čísla, validátor vypíše: Chybný kód IBAN - kontrolní číslice. Český IBAN má strukturu CZkk bbbb rrrr rruu uuuu uuuu, kde kk je kontrolní číslo. Právě kontrolní číslo závisí na ostatních částech a zajišťuje, že kontrolní součet funguje (rovná se 1). Pokud bychom chtěli mít kontrolní číslo v IBANu stejné jako u starého čísla, bude to o něco složitější.

Když se podíváme hlouběji do kódu validátoru, tak můžeme vidět jeho implementaci:

DI=IB.substring(2,4);
CU=IB.substring(8,14);
AC=IB.substring(14,24);
BK=IB.substring(4,8);
KO=calc(BK+CU+AC+"1235"+DI);

if(KO==1){
  // ... ok, další validace
}else{
  // ...
  stat='Chybný kód IBAN - kontrolní číslice';
  // ...
}

Pro zajímavost funkce calc:

function calc(buf) {
 var index=0;
 var dividend;
 var pz=-1;
 while(index <= buf.length) {
  if (pz < 0) {
   dividend=buf.substring(index,index+9)
   index+=9;
  } else if (pz >= 0 && pz <= 9) {
   dividend=pz+buf.substring(index,index+8);
   index+=8;
  } else {
   dividend=pz+buf.substring(index,index+7);
   index+=7;
  }
  pz=dividend % 97;
 }
 return pz;
}

Došlo mi, že kvůli tomuto kontrolnímu součtu budu muset změnit více než jen dvě první číslice. Nestačí ani čtyři první číslice. Řešení přinesla až změna prvních dvou a posledních dvou číslic.

Slepil jsem vše dohromady a vytvořil následující fragment kódu, který když spustíme v konzoli, vypíše všechna validní čísla účtů ve formátu AAXXXXXXBB, kde AA a BB jsou nové části a XXXXXX je část původního čísla.

let old = "XXXXXXXXXX"; // číslo účtu
let oldIbanPrefix = "CZXXYYYY000000";  // XX = kontrolní součet, YYYY = kód banky

for (let i = 30; i < 99; i++) {
    for (let j = 0; j < 99; j++) {
        let n = "" + i + old.substr(2, 6) + (j < 10 ? "0" : "") + j;

        let IB = oldIbanPrefix + n;
        let DI = IB.substring(2, 4);
        let CU = IB.substring(8, 14);
        let AC = IB.substring(14, 24);
        let BK = IB.substring(4, 8);
        let KO = calc(BK + CU + AC + "1235" + DI);

        let valid = ((test_num(n) === "CM") && (KO == 1));
        if (valid) {
            console.log(n);
        }
    }
}

Program uvedený výše mi vypsal celkem 4 vhodná čísla.

Závěr

Ukázali jsme si, jak vygenerovat validní číslo tak, aby bylo podobné jinému číslu účtu. Já jsem byl u banky úspěšný a jsem více než spokojený. Moje nové číslo navíc začíná na 42.

Discussion

There are 2 comments.

Replying to 65dc8d1e-a15d-4164-85c0-3ab1bd1c9f93:

Ano, je to tak, díky. Je to opravené.

Tvé řešení obsahuje jednu zásadní chybu, kvůli které máš tak málo kombinací. A to je, že tvůj IBAN začíná "CZ69". CZ je jasné, ale 69 je kontrolní číslice. Pokud bys měnil i tuto číslici, můžeš mít mnohem více kombinací. Problematiku IBAN popisuji zde: https://www.kutac.cz/pocitace-a-internety/generovani-a-kontrola-ibanu-pro-cz-i-sk-ucty