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".
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
Alternatywne zestawy wag do weryfikacji - (dopisane 27.10.2011r)
Do algorytmu weryfikacji można też użyć innych zestawów wag.
Powszechnie znany w internecie zestaw wag: (1 3 7 9 1 3 7 9 1 3 1). Następne zestawy:
(3 9 1 7 3 9 1 7 3 9 3), (9 7 3 1 9 7 3 1 9 7 9), (7 1 9 3 7 1 9 3 7 1 7).
Jaki jest związek między tymi czterema zestawami wag?
Dla członków MENSY nie powinno być problemu z odgadnięciem :-)
Druga zagadka. Skoro każdy z tych czterech zestawów może byc użyty,
to który z nich jest używany przez MSWiA i system PESEL? Niestety nie
dotarłem do oficjalnego dokumentu na ten temat.
Dlaczego w wagach użyto cyfr 1 3 7 9 ?
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.
Weryfikacja sensowności numeru PESEL
Jak wiadomo w numerze PESEL są zakodowane informacje o dacie urodzenia
i płci danej osoby. Prawdziwość numeru PESEL, tzn. czy konkretny numer
PESEL jest przypisany jakiejś osobie, można tylko zweryfikować w samym
systemie PESEL. A do tego systemu mają on-line tylko dostęp wybrane urzędy.
Zwykły obywatel może się dowiedzieć za pieniądze!
Można natomiast, oprócz cyfry kontrolnej, sprawdzić sensowność daty
urodzenia.
Przykładowy numer PESEL =49040501580 zdekodujemy:
49 oznacza rok urodzenie 1949,
04 oznacza miesiąc 4. czyli kwiecień,
05 oznacza dzień 5.
A jak jest załatwiany problem wieku XIX, XX, XXI?
Dla wieku XX do numeru miesiąca dodaje się 00 - czyli nic się nie dodaje.
Dla wieku XXI dodaje się 20, dla wieku XXII dodaje się 40,
dla wieku XXIII dodaje się 60.
Natomiast 80 dodaje się do numeru miesiąca dla wieku XIX.
Wiadomo, że numer roku może przyjąć dowolną wartość od 00 do 99,
natomiast numer miesiąca wartości od 01 do 12. Gorzej jest z numerem dnia
w miasiącu gdyż jest to wartość zmienna w zakresie od 1 do 31. W różnych
miesiącach może to być 30 lub 31, a dla lutego może być to 28 lub 29 zależnie
od przestępności roku. Jednym słowem trzeba użyć jakiejś procedury, która
sprawdzi poprawność daty. W języku programowania PHP i Javascript używanych
powszechnie do obróbki danych w serwisach internetowych jest to dość proste.
Krótko: taki PESEL 00000000000 ma prawidłową cyfrę kontrolną,
ale jest w oczywisty sposób bezsensowny. Rozkodowana data urodzenia to:
rok=1900 miesiąc=00 dzień=00
Raczej bez sensu. Niestety niektóre weryfikatory pokazują takie bzdury.
Patrz przykładowy program sprawdzacz:
https://code.google.com/archive/p/sprawdzacz/
Pokazuje w wersji 0.4  |
W wersji 0.5 już poprawiono
|
Program także reaguje na błędną datę w PESELu. Numer 19222900001 ma poprawną cyfrę kontrolną, ale data 29 lutego 2019 nie istnieje.
|

|
Czy algorytm sumy kontrolnej 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 mają 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 "http://www1.mswia.gov.pl/index.php?dzial=72&id=32"
, 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ć GIODO, RODO i SRODO:)
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.
-
Pytanie: ile rodzi się dzieci każdego dnia?
Tu jest dokładna liczba:
gazeta.pl
Cytat :
"Główny Urząd Statystyczny podaje w raporcie 'Podstawowe informacje o sytuacji
demograficznej Polski w 2011 roku', że w 2011 r. urodziło się ok. 391 tys.
dzieci. Jest to ponad 22 tys. mniej niż przed rokiem. W latach 2003-2009
odnotowano stopniowy wzrost liczby urodzin z 351 tys. do 417,6 tys.
W 2010 roku urodziło się już tylko 413 tys. dzieci."
Jest też tam wykres dla lat od 1946 do teraz:

Liczba urodzeń w Polsce od roku 1946 w tysiącach. Dane GUS
Z tego wykresu wynika, że maksimum wyszło w latach 1951-56 i wynosiło ok 800tys/rok
Czyli rocznie to było maksymalnie 800 tys dzieci.
Dziennie daje to 800000/365 = 2192 dzieci na dzień.
Ale w ciągu roku ta liczba się waha, więc przyjmijmy, że to jest maksymalnie
3tys dzieci na dzień. Przyjmijmy 1500 dziewczynek i 1500 chłopców.
Jeżeli ponumerujemy wszystkie te dzieci urodzone tego samego dnia to
ostatnie dziecko będzie miało numer 3000. Kolejnymi liczbami parzystymi
numerujemy dziewczynki, a nieparzystymi numerujemy chłopców.
Przypuśćmy, że dzieci się urodziły 1 stycznia 1999 roku.
Pierwsza dziewczynka wpisana do rejestru PESEL będzie miała numer PESEL = 990101 0000 2
Pierwsza część to data urodzenia, druga to numer kolejny a ostatnia to cyfra kontrolna.
Pierwszy chłopiec będzie miał numer PESEL 990101 0001 9.
Ostatnia dziewczynka może mieć numer PESEL 990101 3000 1.
Jak więc widać, cztery cyfry na numer kolejny wystarczają.
Pamiętajmy, że wykorzystujemy też cyfrę do kodowania płci,
ale ta ósma cyfra ma dziesięć różnych wartości. Połowa
z nich jest dla dziewczynek, a połowa dla chłopców.
A siódma cyfra to nie tylko 0 i 1.
W zbiorze różnych prawdziwych numerów PESEL na siódmym miejscu mam:
2737 razy cyfrę 0,
648 razy cyfrę 1,
25 razy cyfrę 2,
5 razy cyfrę 3,
dwa razy cyfrę 4,
trzy razy cyfrę 5,
dwa razy cyfrę 6,
jeden raz cyfrę 8.
- 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. http://www.mswia.gov.pl/pl?dzial=&id=6628
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:
- "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.
- "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.
- "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
PESEL Wstępne założenia koncepcji
W opublikowanej w 1972 roku pracy
PESEL Wstępne założenia koncepcji,
przedstawiono uzasadnienie budowy samego identyfikatora osobowego, zwanego teraz
numerem PESEL oraz organizację częściowo scentralizowanego systemu nadawania tych
identyfikatorów.
W przedstawionej koncepcji zaproponowano by data urodzenia była w kolejności dd-mm-rr.
Aktualnie w identyfikatorze jest kolejność rr-mm-dd.
Zaproponowany wtedy sposób kodowania daty urodzenia w XIX, XXI, XXII i XXIII pozostał bez zmian.
Wstępnie zaproponowana metoda obliczania cyfry kontrolnej opierała się o inny zestaw
współczynników wagowych (2 1 2 1 2 1 2 1 2 1).
„Osoba urodzona w dniu 5 lipca 2002, płci męskiej, której przydzielono numer serii
2345 posiadać będzie następujący identyfikator.
0 5 2 7 0 2 2 3 4 5 ·
× 2 1 2 1 2 1 2 1 2 1
--------------------------------------
0 + 5 + 4 + 7 + 0 + 2 + 4 + 3 + 8 + 5 = 38
10 - 8 = 2
Cyfra kontrolna = 2
Pełny identyfikator ma więc postać: 05270223452.”
13 września 2022
|