Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Sicherheit / Pers.ausw.

Personalausweis auf Gültigkeit prüfen

Einleitung

Eigene Umfragen? Voting-Tool von Jost Schwider!
Gesetzliche Grundlagen

Weitere Hinweise können Sie dem Personalausweis- und Passgesetz entnehmen.

Die Funktion

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... Smile!

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.

Beispiel

Nummer = "1220000016D<<4509303<0110052<<<<<<7"
If PersonalausweisOK(Nummer) Then
  MsgBox "Alles klar"
Else
  MsgBox "Schäm dich!"
End If

Code / Quelltext

PersonalausweisOK

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
Prüffziffer

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