Algorytmy

Obliczanie sumy kontrolnej numeru karty kredytowej oraz numeru banku

  • 2007-12-25 13:27
  • 1 komentarz
  • 6918 odsłon
  • Oceń ten tekst jako pierwszy
W tym artykule postaram się przedstawić Wam sposób na obliczanie sum kontrolnych dla numeru karty kredytowej oraz numeru banku.

Suma kontrolna dla karty kredytowej.

Przedstawiony tutaj sposób nie różni się niczym od sposobów opisywanych przez Twardego wystarczy zmienić tylko wagi.

WAGI : 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1

Powinno być 16 tych cyferek, ponieważ tyle ma numer karty, jeżeli posiadany przez Ciebie numer jest krótszy musisz dodać na jego początku zera tak, aby jego długość była równa 16.

Zastosowanie

1. Mnożymy kolejne cyfry numeru karty przez wagi   np.

   5694513500001252     -- numer karty

* 2121212121212121     -- wagi


10|6|18|4|10|1|6|5|0|0|0|0|2|2|10|2

2.  Sumujemy wyniki otrzymany w podpunkcie 1. Jeżeli iloczyn był  większy od 9 to rozbijamy go na 2 liczby}.

1+0+6+1+8+4+1+0+1+6+5+0+0+0+0+2+2+1+0+2  = 40

3. Wynik otrzymany w podpunkcie 2. dzielimy modulo 10

40 mod 10 = 0

Jeżeli otrzymaną liczbą jest 0 to znaczy, że numer jest poprawny


Suma kontrolna dla numeru banku

Zasada obliczani sumy kontrolnej jest prawie identyczne jak w przypadku numeru karty.

WAGI: 7,1,3,9,7,11,3

Zastosowanie

1. 1. Mnożymy kolejne cyfry numeru karty przez wagi   np.

   33142 0 1  (0)  -- numer banku

* 71397113        -- wagi


21|3|3|36|14|0|3

2.  Sumujemy wyniki otrzymany w podpunkcie 1.

21+3+3+36+14+0+3 =  80

3. Wynik otrzymany w podpunkcie 2. dzielimy modulo 10

80 mod 10 = 0

Jeżeli wynik równy jest liczbie kontrolnej to numer banku jest poprawny.

Suma kontrolna dla numeru bankowego IBAN

IBAN (International Bank Account Number) ? norma ISO-13616 wprowadzona w celu weryfikacji numerów kont bankowych.

Na numer IBAN składa się z dwuliterowego kudu państwa, dwucyfrowej sumy kontrolnej oraz numeru konta.

Weryfikacja numeru

Numer wyjściowy ? BE62 5100 0754  7061

1. Usunięcie znaków specjalnych z numery (spacje, myślniki) | BE6251000754 7061|

2. Przesunięcie kodu państwa oraz sumy kontrolnej na koniec (pierwsze 4 znaki)
|51000754 7061BE62|

3. Zamiana liter na cyfry. A=10 B=11 C=12 ? Z=35  |51000754 7061111462|

3. Dzielimy modulo 97

51000754 7061111462 mod 97 = 1

Wyliczanie sum kontrolnych

1. Sumę kontrolną (3 i 4 znak) zastąp dwoma zerami ) | BE0051000754 7061|

2. Zamiana liter na cyfry. A=10 B=11 C=12 ? Z=35  |510007547061111400|

3.  Dzielimy modulo 97

510007547061111400 mod 97 = 36

4. Odejmij wynik z punktu 3. od 98

98 ? 36 =  62   -- suma kontrolna

Jeśli wynik jest jednocyfrowy trzeba dodać przed nim 0


Bonus ;)

Aby uniknąć dzielenia takich dużych liczb możemy rozbić je nam mniejsze. np.

510007547061111400   rozbijamy na   510007547 i 061111400

510007547 mod 97 =  74

Otrzymaną liczbę dopisujemy na początku drugiej liczby i wykonujemy ponownie dzielenie

74061111400 mod 97 = 36

Jako wynik otrzymaliśmy to samo, co w wyniku dzielenia

510007547061111400 mod 97 = 36

function IsValidIBAN(const IBAN: string): Boolean;
// http://www.ecbs.org/Download/EBS204_V3.2.pdf
 
  function mod97(const number: string): integer;
  var
    x: longint;
    l: integer;
    t: string;
  begin
    x := 0;
    t := number;
    l := Length(t);
    while (l > 2) do // maximum length of mod 97 string
    begin
      x := StrToInt(copy(t, 1, 9)) mod 97;
      t := IntToStr(x)+copy(t, 10, l);
      l := Length(t);
    end;
    result := x;
  end;
 
  function A2N(const c: char): string; // alpha to numeric conversion
  begin
    result := IntToStr(Ord(UpCase(c))-Ord('A')+10);
  end;
 
const
  IBANDigits = ['0'..'9'];
  IBANLetters = [ 'a'..'z', 'A'..'Z'];
  IBANCharacters = IBANDigits + IBANLetters;
var
  Part1, Part2: string;
  EndPtr, CurPtr, Counter: integer;
begin
  EndPtr := Length(IBAN);
  CurPtr := 1;
  Counter := 0;
  while CurPtr <= EndPtr do
  begin
    if IBAN[CurPtr] in IBANCharacters then
    begin
      if Counter < 4 then
      begin
        if IBAN[CurPtr] in IBANLetters then
          Part1 := Part1 + A2N(IBAN[CurPtr])
        else
          Part1 := Part1 + IBAN[CurPtr];
      end
      else
      begin
        if IBAN[CurPtr] in IBANLetters then
          Part2 := Part2 + A2N(IBAN[CurPtr])
        else
          Part2 := Part2 + IBAN[CurPtr];
      end;
      inc(Counter);
    end;
    inc(CurPtr);
  end;
  result := mod97(Part2+Part1) = 1;
end;

1 komentarz

Marooned 2004-04-09 20:43

Zero formatowania przez co tekst sie dłuży i jest mało przejrzysty.