Luhn -algoritmi - Luhn algorithm

Luhn algoritmi tai Luhn kaava , joka tunnetaan myös nimellä " moduuli 10" tai "mod 10" algoritmi , joka on nimetty sen luoja, IBM tutkija Hans Peter Luhn , on yksinkertainen tarkistussumma kaavaa käytetään vahvistamaan erilaisia tunnistenumerot, kuten pisteitä kortin numerot , IMEI -numerot , kansalliset palveluntarjoajan tunnistenumerot Yhdysvalloissa, Kanadan sosiaalivakuutusnumerot , Israelin henkilötunnukset, Etelä -Afrikan henkilötunnukset, Ruotsin kansalliset tunnistenumerot , ruotsalaiset yritystunnukset (OrgNr), Kreikan sosiaaliturvatunnukset (ΑΜΚΑ), SIM -korttien numerot ja kyselykoodit, jotka näkyvät McDonald'sin , Taco Bellin ja Tractor Supply Co. -kuiteissa. Se on kuvattu US -patentissa 2 950 048, myönnetty 23. elokuuta 1960.

Algoritmi on julkinen ja sitä käytetään nykyään laajasti. Se on määritelty standardissa ISO/IEC 7812 -1. Sitä ei ole tarkoitettu salakirjoituksellisesti suojattuun hajautustoimintoon ; se on suunniteltu suojaamaan vahingossa tapahtuvilta virheiltä, ​​ei haitallisilta hyökkäyksiltä. Useimmat luottokortit ja monet viranomaisten tunnusnumerot käyttävät algoritmia yksinkertaisena tapana erottaa kelvolliset numerot väärin kirjoitetuista tai muuten virheellisistä numeroista.

Kuvaus

Tarkistusnumero lasketaan seuraavasti:

  1. Ota alkuperäinen numero ja aloita oikeanpuoleisimmasta vasemmalla olevasta numerosta kaksinkertaistamalla jokaisen toisen numeron arvo (mukaan lukien oikeanpuoleisin numero).
  2. Korvaa tuloksena oleva arvo kussakin paikassa tämän sijainnin arvon numeroiden summalla.
  3. Yhteenvetona tuloksena arvot kaikissa asennoissa ( t ).
  4. Laskettu tarkistusnumero on yhtä suuri kuin .

Esimerkki tarkistusnumeron laskemisesta

Oletetaan esimerkki tilinumero "7992739871" (vain "hyötykuorma", tarkistusnumero ei ole vielä mukana):

7 9 9 2 7 3 9 8 7 1
Kertoimet 1 2 1 2 1 2 1 2 1 2
= = = = = = = = = =
7 18 9 4 7 6 9 16 7 2
Summanumerot 7 9 (1+8) 9 4 7 6 9 7 (1+6) 7 2

Tuloksena olevien numeroiden summa on 67.

Tarkistusnumero on yhtä suuri kuin .

Tällöin koko tilinumero on 79927398713.

Esimerkki tarkistusnumeron vahvistamisesta

Katkaise vain vahvistettavan numeron tarkistusnumero (viimeinen numero). 79927398713 -> 7992739871 Laske tarkistusnumero (katso yllä) (3) ja vertaa tulosta leikkaamaasi tarkistusnumeroon (3 = 3). Jos ne vastaavat lukua, se läpäisi testin.

Vahvuudet ja heikkoudet

Luhn-algoritmi havaitsee kaikki yksinumeroiset virheet sekä lähes kaikki vierekkäisten numeroiden siirtotavat. Se ei kuitenkaan havaita osaksi kaksinumeroinen sekvenssin 09 kohteeseen 90 (tai päinvastoin). Se tunnistaa suurimman osan mahdollisista kaksoisvirheistä (se ei havaitse 2255 , 3366 tai 4477 ).

Muut monimutkaisemmat tarkistusnumeroalgoritmit (kuten Verhoeffin ja Dammin algoritmi ) voivat havaita enemmän transkriptiovirheitä. Luhn mod N-algoritmi on laajennus, joka tukee ei-numeerisia jouset.

Koska algoritmi toimii numeroilla oikealta vasemmalle ja nollanumerot vaikuttavat tulokseen vain, jos ne aiheuttavat sijainnin siirtymän, nollan pehmuste numerojonon alussa ei vaikuta laskentaan. Siksi järjestelmät, jotka määrittävät tietyn numeromäärän (esimerkiksi muuntamalla 1234 arvoksi 0001234), voivat suorittaa Luhn -validoinnin ennen täyttöä tai sen jälkeen ja saavuttaa saman tuloksen.

Algoritmi ilmestyi yhdysvaltalaisessa patentissa, joka koski kädessä pidettävää, mekaanista laitetta tarkistussumman laskemiseksi. Siksi sen piti olla melko yksinkertainen. Laite otti mod 10 -summan mekaanisesti. Korvaaminen numerot , että on, tulokset kahden ja vähentää menettelyn, joita ei ole tuotettu mekaanisesti. Pikemminkin numerot on merkitty permutoidussa järjestyksessä koneen runkoon.

Pseudokoodin toteutus

function checkLuhn(string purportedCC) {
    int nDigits := length(purportedCC)
    int sum := integer(purportedCC[nDigits-1])
    int parity := (nDigits-1) modulus 2
    for i from 0 to nDigits - 2 {
        int digit := integer(purportedCC[i])
        if i modulus 2 = parity
            digit := digit × 2
        if digit > 9
            digit := digit - 9 
        sum := sum + digit
    }
    return (sum modulus 10) = 0
}

Viitteet

  1. ^ a b US-patentti 2950048A , Luhn , Hans P. , "Tietokone numeroiden tarkistamiseen", julkaistu 1960-08-23 
  2. ^ "Liite B: Luhnin kaava laskentamoduulin 10 laskemiseen" kaksoislisäys-kaksois "tarkistusnumerot". Henkilökortit - Liikkeeseenlaskijoiden tunnistus - Osa 1: Numerointi (vakio). Kansainvälinen standardointijärjestö , kansainvälinen sähkötekninen komissio . Tammikuu 2017. ISO/IEC 7812 -1: 2017.

Ulkoiset linkit