Suma lub cyfra kontrolna - cd.

System PESEL - rys historyczny wg MSWIA

Rok 1970
Decyzja Prezydium Rządu z dnia 9.06.1970r. w sprawie przygotowania koncepcji Powszechnego Elektronicznego Systemu Ewidencji Ludności, którego zadaniem będzie kompleksowe ujęcie tematu „człowiek” jako centralnego podmiotu całej gospodarki.

Rok 1972
Opracowane zostały wstępne założenia koncepcji Powszechnego Elektronicznego Systemu Ewidencji Ludności,
• koncepcja przewidywała tworzenie systemu PESEL w oparciu o podstawowe i powszechne ewidencje osobowe będące w gestii resortu spraw wewnętrznych tj. ewidencje stanu cywilnego, dowodów osobistych, adresowe, zmian imion i nazwisk,
• wszystkie inne ewidencje osobowe prowadzone na terenie kraju miały uzupełniać swoimi informacjami zbiory podstawowe i pobierać z nich potrzebne informacje,
• informacje zawarte w systemie PESEL, w miarę jego rozwoju powinny powodować zanik dublowania tych informacji we wszystkich innych zbiorach.

Rok 1973
Decyzją Prezydium Rządu z 5.07.1973r. Ministerstwo Spraw Wewnętrznych wspólnie z innymi resortami zostało zobowiązane do uruchomienia podsystemu PESEL, obejmującego ewidencję osób z wyższym wykształceniem zwanego systemem MAGISTER.

Rok 1974
Decyzja Prezydium Rządu z 11.01.1974r. definiuje PESEL jako „rządowy system zautomatyzowanego gromadzenia, przetwarzania i udostępniania informacji o ludności kraju obejmujący podstawowe cechy demograficzne i służący potrzebom gospodarowania kadrami, planowania gospodarczego oraz usprawniania procesów administrowania”.

Numer PESEL - cyfra kontrolna

Dla numeru PESEL algorytm obliczenia cyfry kontrolnej przebiega następująco: każdej z pozycji cyfr numeru nadany został stały współczynnik zwany wagą pozycji. Każdą cyfrę numeru mnoży się przez odpowiednią wagę i sumuje się wynik mnożenia. Otrzymany wynik dzieli się modulo 10 i odejmuje od 10.

  • NB. powyższy opis spotykany jest w polskim Internecie (np. Stepa, Radosław Roszczyk, Marcin Sulecki) i zawiera pewien drobny błąd: Brak opisu co należy zrobić jeśli po sumowaniu iloczynów ostatnia cyfra będzie zerem. Oczywiście różnica 10-x wyjdzie 10 i wtedy należy przyjąć 0 jako cyfrę kontrolną a nie 10.
    Ten sam błąd występuje w opisach i w algorytmach zastosowanych w formularzach do weryfikacji numerów PESEL, REGON itd. stworzonych już po opublikowaniu niniejszego tekstu (np. pliszak) - trochę wstyd - prawda ?

    A ostatnio (13.8.2005) stwierdziłem, że ten błąd jest także popełniony na stronie Ministerstwa Spraw Wewnętrznych i Administracji dotyczącej właśnie Systemu PESEL - tym razem to straszny wstyd – we wrześniu 2009 nadal błąd jest nie poprawiony.
    Także na stronie http://www.pko.pl/f/pesel.htm błędnie jest weryfikowany numer PESEL z powodu tego samego błędu. (6.2.2006)

Jak łatwo zauważyć odjęcie wyniku od 10 nic w zasadzie nie zmienia ale widocznie twórcy systemu PESEL (Powszechy Elektroniczny System Ewidencji Ludności) dostali rozkaz (a były to lata siedemdziesiąte) aby trochę utrudnić rozszyfrowanie tego systemu zachodnim szpiegom :-).
Ale z doniesień czytelnika tej strony wynika, że cały system PESEL, chyba nawet z komputerami, był kupiony od Szwedów, więc o tajemnicy nie ma mowy. :-(
Ale ... w Szwecji personnummer, odpowiednik numeru PESEL ma tylko 10 cyfr, cyfrę kontrolną oblicza się według metody Luhn'a, algorytmu, w którym mnożnikami są przemiennie 1 i 2. Wspólnymi cechami z systemem szwedzkim są: sześciocyfrowy zapis daty urodzenia, oznaczenie płci w numerze i położenie cyfry kontrolnej na końcu numeru.
Więcej o zawartości informacyjnej systemu PESEL można znaleźć w wikipedii

Powyższy algorytm jest w zasadzie modyfikacją ogólniejszego algorytmu stosowanego przy weryfikacji numerow NIP, REGON, ISBN, ISSN, EAN itd. W ogólnym algorytmie sumę iloczynów cyfr i wag dzieli się modulo N (oblicza resztę z dzielenia przez N). Dla N=10 wynik dzielenia modulo N jest po prostu ostatnią cyfrą sumy.

 Oto przykład dla numeru PESEL 49040501580

    1 3 7 9 1 3 7 9 1 3    --> wagi
    X X X X X X X X X X Y  --> cyfry nr PESEL (Y- cyfra kontrolna)

czyli:       
            1 3 7 9 1 3 7 9 1 3
         *  4 9 0 4 0 5 0 1 5 8
        -----------------------
suma=(1*4+3*9+7*0+9*4+1*0+3*5+7*0+9*1+1*5+3*8)=
    =(  4+ 27+  0+ 36+  0+ 15+  0+  9+  5+ 24)=  120
 
          120 mod 10 = 0

           10 - 0 =  10   ----> cyfra kontrolna ?
 korekta: dla wyniku 10   ----> cyfra kontrolna = 0

Uzyskany wynik jest cyfrą kontrolną numeru, który w naszym przypadku ma postać: 49040501580 i dotyczy kobiety urodzonej: 5 kwietnia 1949 roku. W przypadku wprowadzenia błędnego numeru PESEL, komputer po obliczeniu cyfry kontrolnej może ten błąd wykryć, gdyż np: jeśli pomylimy się i zamiast 49040501580 podamy 46040501580 to otrzymamy:

            1 3 7 9 1 3 7 9 1 3
         *  4 6 0 4 0 5 0 1 5 8
        -----------------------
suma=(1*4+3*6+7*0+9*4+1*0+3*5+7*0+9*1+1*5+3*8)=
    =(  4+ 18+  0+ 36+  0+ 15+  0+  9+  5+ 24)=  111
          111 mod 10 = 1
           10 - 1 =  9

Obliczona cyfra kontrolna to 9, podczas gdy prawidłowa cyfra to 0. Oczywiście może nastąpić przypadek błędnego wprowadzenia także ostatniej cyfry.
W tym przykładzie łatwo sie pomylić gdyż na formularzu drukowanym na drukarce igłowej cyfra 0 jest podobna do cyfry 8. Wtedy algorytm przepuści błędne dane.

Weryfikacja numeru PESEL
może być wykonana według podobnego, ale prostszego algorytmu:
Do cyfr wagowych dla dziesięciu cyfr dopisujemy wagę równą 1 dla cyfry kontrolnej - czyli dla jedenastej cyfry. Sumujemy iloczyny kolejnych cyfr i ich wag. Jeśli ostatnia cyfra wyniku wynosi 0 (zero) to numer PESEL jest prawidłowy.

Łukasz Pilorz (2006) bardzo sprytnie zauważył, że "... wystarczy zmienić kolejność wag na 9-7-3-1, by pozbyć się za jednym zamachem dodatkowego kroku i problemu "10-0=10". Szkoda, że sam na to nie wpadłem :)
Ale ściśle rzecz biorąc nie chodzi o zamianę kolejności wag 1-3-7-9 ale o użycie wag, które są dopełnieniem starych wag do liczby użytej jako modulo sumy iloczynów.

              10 10 10 10
  stare wagi  -1 -3 -7 -9
  ________________________
  nowe wagi    9  7  3  1

dla nowych wag:       
            9 7 3 1 9 7 3 1 9 7
         *  4 9 0 4 0 5 0 1 5 8
        -----------------------
suma=(9*4+7*9+3*0+1*4+9*0+7*5+3*0+1*1+9*5+7*8)=
    =( 36+ 63+  0+  4+  0+ 35+  0+  1+ 45+ 56)=  240
 
          240 mod 10 = 0  wynik jest cyfrą kontrolną 
                          nie wymaga odejmowania od 10          

Dlaczego użyto takich wag ? Proszę zwrócić uwagę, że w wagach brak jest cyfry 5. Dlaczego?
Ponieważ gdyby była cyfra 5 to przy pomyłkowym wprowadzeniu 3 zamiast 5 otrzymalibyśmy wprawdzie inną sumę kontrolną, ale cyfra kontrolna byłaby taka sama: bo 5x5=25, 3x5=15 i oba wyniki kończą się tą samą cyfrą 5
Z tych samych powodów w wagach nie występuje żadna liczba parzysta, a tym bardziej zero!

Bardziej matematyczny dowód sensowności użycia wag 1 3 7 9 przy dzieleniu modulo 10 oraz wyższość dzielenia modulo 11 pokazałem na stronie wagi. Jest tam także analizowana odporność powyższych wag i wag algorytmu Luhna na czeskie błędy.

Czy ten algorytm jest optymalny ?

W jednym z tekstów w internecie podano, że stopa błędów tego algorytmu wynosi 2,3% - być może chodzi o czeskie błędy. Ale według mnie wynosi 10% co łatwo wyliczyć jeśli uwzględnimy, że cyfra kontrolna może przyjąć 10 wartości, z których jedna jest prawidłowa. Z elementarnego rachunku prawdopodobieństwa wychodzi 1/10*100% = 10%.
Co więcej, wskutek przyjęcia tych samych wag dla cyfr roku i cyfr dnia algorytm jest podatny na błędne podanie daty urodzenia przy nadawaniu numeru PESEL przez tajne (brak jego strony w internecie) Rządowe Centrum Informatyczne "PESEL" lub jego terenowy oddział. Pamiętajmy, że w numerze PESEL zakodowana jest data urodzenia konkretnej osoby. Dla przykładu osoba urodzona 11 maja 1912 roku powinna być zakodowana jako 120511xxxxk. Tymczasem przy wprowadzaniu łatwo się pomylić i wpisać w kolejności dzień miesiąc rok jako: 110512xxxxk. Oba takie numery PESEL będą miały tę samą cyfrę kontrolną.

Ciekawostki w kodowaniu numeru PESEL

  • Dwie pierwsze cyfry oznaczają ostatnie dwie cyfry w roku urodzenia. Dla przykładu osoba urodzona w roku 1966 ma w numerze PESEL 66mmddxxxxk.
  • Cyfra trzecia i czwarta oznaczają miesiąc urodzenia.
  • Ale jeśli dana osoba urodziła się przed rokiem 1900, ale po roku 1800 to do liczby miesiąca dodaje się 80. Dla przykładu: osoba urodzona 1 grudnia 1898 ma numer PESEL 989201xxxxk
  • Osoby urodzone w roku 2000 i później będą miały powiększony numer miesiąca o liczbę 20. Dla przykładu osoba urodzona 1 grudnia 2000 będzie miała numer PESEL 003201xxxxk
  • Cyfry piąta i szósta oznaczają dzień urodzenia.
  • W cyfrach siódmej, ósmej, dziewiątej i dziesiątej zakodowany jest numer seryjny :-) danego osobnika.
  • W dziesiątej cyfrze PESEL zakodowana jest jednocześnie płeć osoby: nieparzysta oznacza mężczyznę, a parzysta kobietę. Ciekawostka: w wielu podobnych do PESELa numerów nadawanych w krajach europejskich nieparzysta cyfra oznacza mężczyznę a parzysta kobietę.
  • W jedenastej jest oczywiście słynna cyfra kontrolna.
  • Na razie brak danych do rozkodowania innych informacji tam zawartych. Nie wiadomo, na przykład, co decyduje czy dana kobieta jako kod płci dostanie 0, 2, 4, 6 czy 8.  . . . badania trwają

    NB1 Oto tekścik na ten temat w dodatku "Komputer" do Gazety Wyborczej z 1995 roku.
    NB2 Według niektórych opinii (uwaga jednego czytelników tego tekstu) " ... 'nr seryjny' jest zakodowany na cyfrach 7-10, tylko kobietom są przydzielane kolejne numerki parzyste, a chłopcom - kolejne nieparzyste.
    A co do innych zakodowanych informacji, to jeśli by tam takowe były, to byłoby to absolutnie nielegalne w świetle ustawy o ochronie danych osobowych (coś tam takiego jest, że nadawanie cyfrom ukrytych znaczeń we wszelkich numerach ewidencyjnych jest zabronione - oprócz oznaczenia płci i daty urodzenia). Ale kto wie... ;)))"
    (moja uwaga na temat ukrytego znaczenia) - system PESEL powstał na długo przed ustawą o ochronie danych osobowych - więc nie musiał być z nią zgodny.

  • W styczniu 2001 zauważyłem stroniczkę na temat Centralnych Rejestrów Państwowych PESEL na serwerze Ministerstwa Spraw Wewnętrznych i Administracji. Jest tam troszkę informacji na ten temat. W roku 2005 był aktualny raczej ten link System PESEL, ale w roku 2008 jest jeszcze gdzie indziej PESEL.
  • Ostatnio zdobyłem z pewnej bazy danych sporą pulę numerów PESEL (bez nazwisk i innych danych osobowych, żeby uspokoić niektórych legalistów) i mogłem przeanalizować 'numery seryjne' zawarte w peselu. Okazuje się, że nie są to numery kolejne. Bowiem najwyższy numer seryjny jaki widziałem w tej puli wynosił (RRMMDDnnnnK) nnnn=9896. Nie wyobrażam sobie ażeby w dniu, w którym urodziła się ta kobieta urodziło się prawie dziesięć tysięcy dzieci. Według mnie ten 'numer seryjny' został wygenerowany sztucznie, a nie jako kolejny numer osobniczy. Dlaczego - tego już nie wiem.
    Przy okazji tej analizy potwierdziła się pewna dziwaczność jeśli chodzi o rozkład częstotliwości urodzeń w ciągu roku. Patrz moje odkrycie.
  • Przykład kodu php do weryfikacji numeru PESEL
    <?php 
    function vpesel($PESEL,$sex="?") {
     if ($PESEL[9] % 2 and $sex=="K") return false;
       else if (!$PESEL[9] % 2 and $sex!="M") return false;
     $w = array(1,3,7,9);
     for ($i=0;$i<=9;$i++)
       $wk = ($wk+$PESEL[$i]*$w[$i % 4]) % 10;
     $k = (10-$wk) % 10;
     if ($PESEL[10]==$k) return true;
       else return false;
    }
    ?>
    

    Zatem funkcja:

    bool(string pesel [,string sex])

    zwraca true jeżeli nr PESEL jest poprawny, w przeciwnym wypadku false.

    Przykłady wywołań:

    vpesel("74021834012") - jeżeli nie mamy informacji o płci
    vpesel("74021834012","M"); - jeżeli wiemy, że to mężczyzna
    vpesel("74021834012","K"); - jeżeli wiemy, że to kobieta

    Powyższy kod i komentarz pochodzi z http://www.szewo.com/php/pesel.phtml

    Pan Arkadiusz Kusznierski (wrzesień 2008) napisał:
    Pozwolę sobie na mały komentarz odnośnie poprawności działania algorytmu. ...
    W kodzie php (funkcja vpesel) ... jest mały błąd.
    W linii nr 4 jest warunek $sex!="M" natomiast na stronie www.szewo.com/php/pesel.phtml warunek ten ma postać $sex=="M".
    Moim zdaniem poprawny jest warunek $sex=="M".
    Jeśli funkcję vpesel wywołamy nie znając płci (na przykład vpesel("80031317708");) to warunek $sex!="M" będzie prawdą ponieważ argument domyślny funkcji $sex ma wartość "?". Wtedy dla numerów pesel posiadających na przedostatniej pozycji 0 (zero) cały warunek pętli if w linii 4 będzie prawdą i funkcja zwróci false. A nie powinna. Jeśli wywołujemy funkcję vpesel bez podawania płci linie 3 i 4 nie powinny zwracać false. W takim przypadku algorytm powinien wykonać się do końca.

    Przetestowałem obie wersje funkcji (starszą i nowszą) i stwierdziłem, że obie dają w pewnych sytuacjach błędy. Nowsza daje mniej błędów :)


    Proszę zwrócić uwagę na wynik trzeci od dołu. Cyfra 2 wskazuje, że to kobieta. Testujemy czy to Mężczyzna, a funkcja mówi, że to prawda.

    Poprawiony kod funkcji daje poprawny wynik dla wszystkich testowanych przypadków


    Diabeł tkwi w szczegółach.
    Aktualny kod 'szewo':
    else if (!$PESEL[9] % 2 and $sex=="M") return false;
    Mój poprawiony kod:
    else if (!($PESEL[9] % 2) and $sex=="M") return false;
    Proszę zwrócić uwagę na wzięcie w nawias wyniku dzielenia modulo, przez co wymuszamy zmianę kolejności działań.

    Kod programu testującego vpesel1.php

    Arkadiusz napisał potem: Operator negacji ma wyższy priorytet niż operator modulo co powoduje, że negacja zawsze wykona się przed działaniem modulo.
    Wprowadzenie nawiasów zamienia tę kolejność i o to nam chodzi.
    Brak tych dodatkowych nawiasów powodował błąd dla PESEL nr 74021834025, natomiast nałożenie się dwóch błędów (brak nawiasów i warunek $sex!="M") powodował błędy dla nr PESEL mających 0 (zero) na 9 pozycji (np. dla PESEL nr 80031317708).
    Brak nawiasów powoduje, że operacja negacji jest wykonywana na argumentach z zakresu od 0 do 9. Interpreter php przed wykonaniem negacji dokona niejawnej konwersji typów z integer na boolean. Jeśli było 0 (zero) to przekonwertuje na false, a jeśli argumenty były z przedziału od 1 do 9 to przekonwertuje na true. To właśnie powoduje błędy.

    Mała ciekawostka na koniec. Wywołanie vpesel("aleglupitxt"); zwróci true, więc warto zabezpieczyć funkcję vpesel przed takim wywołaniem.


  • Kod arkusza Excela do obliczenia cyfry kontrolnej dla wielu wprowadzonych numerów PESEL — niewielka przeróbka umożliwia weryfikację.
    arkusz pesel3.xls (44kB)
  • Ciekawostka: w wielu podobnych do PESELa numerów nadawanych w krajach europejskich nieparzysta cyfra na pewnej pozycji oznacza mężczyznę a parzysta kobietę. I co ciekawsze po zmianie płci przydzielany jest nowy numer :)

Tak zwany System PESEL2

Komunikat o zakończeniu realizacji Projektu PESEL2 - serwer MSWiA

Realizacja Projektu PESEL2, tworzonego przez MSWiA w ramach działania 1.5 Sektorowego Programu Operacyjnego Wzrost Konkurencyjności Przedsiębiorstw, została zakończona dnia 30 września 2008 roku.

W grudniu 2007 roku, z uwagi na znaczące opóźnienia w realizacji Projektu w latach 2005-2007, MSWiA opracowało plan naprawczy, który zakładał istotne ograniczenie zakresu projektu do elementów realizowalnych w czasie pozostałym do rozliczenia projektu. Uzgodniony zakres usług obejmował gruntowną modernizację infrastruktury sprzętowej centralnych rejestrów państwowych wraz z uruchomieniem w jej środowisku e-usług. Z powodzeniem wykonano modernizację systemu rejestrów państwowych funkcjonującego na przestarzałym środowisku informatycznym "JANTAR" (pochodzącym z lat 70-tych). Zrealizowano również następujące usługi:

  1. "Weryfikacja istnienia dowodu osobistego, zawierającego określony zestaw danych w bazie aktualnych dowodów osobistych" - po podaniu określonych informacji zawartych w dowodzie osobistym usługa wyszukuje dokument w Ogólnokrajowej Ewidencji Wydanych i Unieważnionych Dowodów Osobistych. W przypadku, gdy podane informacje będą zgodne z zapisami w bazie danych, system zwróci informację o pomyślnej weryfikacji.
  2. "Weryfikacja danych adresowych osób ewidencjonowanych w rejestrze PESEL" - na podstawie danych osoby i wskazanego adres, usługa pozwala zweryfikować, czy osoba jest zameldowana pod podanym adresem.
  3. "Udostępnianie danych adresowych osób ewidencjonowanych w rejestrze PESEL" - po wprowadzeniu danych osoby usługa pozwala uzyskać jej bieżący adres zameldowania.

Usługi są dostępne dla przedsiębiorców: pierwsze dwie w trybie teletransmisji, a trzecia przez elektroniczną Platformę Usług Administracji Publicznej.

Przebudowując rejestry państwowe, zdecydowano się wykorzystać rozwiązania technologiczne pozwalające sprawnie i dynamicznie zreformować eksploatowane systemy w celu ich dostosowania do planowanego odmiejscowienia czynności urzędowych. Pomyślnie zrealizowane zadania nakreślone w ramach planu naprawczego stanowią podstawy do rozpoczęcia przez MSWiA prac nad projektem pl.ID - elektronicznym dokumentem tożsamości.

17 listopada 2008



ciąg dalszy


          Licznik = (od 21 lipca 2000)
          ostatnie poprawki

Valid HTML 4.01!