Kontakt
DSVGO
Eigene Umfragen? Voting-Tool von Jost Schwider! |
Weitere Hinweise können Sie dem Personalausweis- und Passgesetz entnehmen.
Mit der unten gezeigten Funktion PersonalausweisOK kann die auf einem deutschen Personalausweis notierte Nummer auf innere Korrektheit geprüft werden. Natürlich ist es damit nicht möglich zu prüfen, ob der Ausweis wirklich existiert...
Optional können das Geburtsdatum, das Ablaufdatum und/oder die Behördenkennzahl angegeben werden, so dass diese auf Konsistenz geprüft werden. Dies ist möglich, weil die Personalausweis-Nummer (im Prinzip) gerade aus den genannten Komponenten besteht (zuzüglich Prüfziffern). Hier der schematische Aufbau:
1220000016D<<4509303<0110052<<<<<<7
Legende:
Behördenkennziffer, fortlaufende Nummer, Ddeutsch, Geburtsdatum, Ablaufdatum, die Prüfziffern
Die Prüfziffern werden berechnet, indem die erste Ziffer mit 7, die zweite mit 3, die dritte mit 1, die vierte wieder mit 7 usw. multipliziert und dann summiert wird, wobei nur die Einerstelle relevant ist.
Nummer = "1220000016D<<4509303<0110052<<<<<<7" If PersonalausweisOK(Nummer) Then MsgBox "Alles klar" Else MsgBox "Schäm dich!" End If
Der Code geht Schritt für Schritt die zu überprüfenden Bereiche durch: Nachdem vorab die grundlegenen Prüfungen bestanden worden sind und alle nicht-numerischen Inhalte ausgefiltert worden sind, werden die o.g. einzelnen Blöcke sowohl auf Konsistenz (z.B. stimmt das Datum überein?) als auch auf die jeweilige Block-Prüfziffer gecheckt. Zum Abschluß wird noch die Prüfziffer der gesamten Nummer überprüft.
Public Function PersonalausweisOK( _ ByVal Nummer As String, _ Optional ByVal Geburtsdatum As Date = -1, _ Optional ByVal Ablaufdatum As Date = -1, _ Optional ByVal Behördenkennzahl As Long = -1 _ ) As Boolean 'Deklarationen: Dim i As Long Dim Char As String Dim NummerPos As Long '0. Vorab-Checks: If Len(Nummer) < 25 _ Then Exit Function 'Nummer zu kurz If Mid$(Nummer, 11, 1) <> "D" _ Then Exit Function 'kein deutscher Personalausweis '1. Nummer normieren/extrahieren: For i = 1 To Len(Nummer) Char = Mid$(Nummer, i, 1) Select Case Char Case "<", " ", "D" 'überspringen Case "0" To "9" 'Nummer merken: NummerPos = NummerPos + 1 If NummerPos > 25 Then Exit Function Mid$(Nummer, NummerPos, 1) = Char Case Else 'ungültiges Zeichen: Exit Function End Select Next i '2. Behördenkennzahl/Seriennummer prüfen: If Behördenkennzahl <> -1 _ Then If Left$(Nummer, 4) <> Format$(Behördenkennzahl, "0000") _ Then Exit Function If Prüffziffer(Left$(Nummer, 9)) <> Mid$(Nummer, 10, 1) _ Then Exit Function '3. Geburtsdatum prüfen: If Geburtsdatum <> -1 _ Then If Mid$(Nummer, 11, 6) <> Format$(Geburtsdatum, "yymmdd") _ Then Exit Function If Prüffziffer(Mid$(Nummer, 11, 6)) <> Mid$(Nummer, 17, 1) _ Then Exit Function '4. Ablaufdatum prüfen: If Ablaufdatum <> -1 _ Then If Mid$(Nummer, 18, 6) <> Format$(Ablaufdatum, "yymmdd") _ Then Exit Function If Prüffziffer(Mid$(Nummer, 18, 6)) <> Mid$(Nummer, 24, 1) _ Then Exit Function '5. Abschlußprüfung: If Prüffziffer(Left$(Nummer, 24)) = Right$(Nummer, 1) _ Then PersonalausweisOK = True End Function
Oben wurde ja bereits erklärt, wie die Prüfziffern gebildet werden. Der folgende Code setzt genau dies um, allerdings wurde der Algorithmus deutlich optimiert (die Multiplikationen werden nur einmal zum Schluß gemacht):
Public Function Prüffziffer(ByRef Ziffernfolge As String) As String Dim i As Long Dim n7 As Long Dim n3 As Long Dim n1 As Long 'Quersumme' bilden: For i = 1 To Len(Ziffernfolge) Step 3 n7 = n7 + Val(Mid$(Ziffernfolge, i, 1)) n3 = n3 + Val(Mid$(Ziffernfolge, i + 1, 1)) n1 = n1 + Val(Mid$(Ziffernfolge, i + 2, 1)) Next i 'Nur Einerstelle beachten: Prüffziffer = CStr((n7 * 7 + n3 * 3 + n1) Mod 10) End Function
© Jost Schwider, 27.09.2001-21.03.2002 - http://vb-tec.de/persausw.htm