Welcome to the personal website and blog of Adrianus Kleemans. Check out
the posts or some of my coding stuff at Projects, or the most recent posts below.

Latest games:

Island Sokoban

Phoenix

adrianus
---

Identitätskarte - Berechnung Prüfziffer

3. June 2019

This post and is about the Swiss identity card and therefore in German.

Die Schweizer Identitätskarte enthält so einige Informationen über uns – wie wir heissen, wie gross wir sind, und noch vieles mehr. Doch daneben gibt es auch einige Zahlen, bei denen nicht auf den ersten Blick klar ist, was sie bedeuten – zum Beispiel die letzte Zahl in der zweiten Reihe:

Es gibt einige Gerüchte, z.B. dass die Zahl darstellen soll,

  • wie viele Menschen mit dem gleichen Namen existieren
  • wie viele Menschen einem ähnlich sehen

Obwohl dies spannende Zahlen wären, handelt es sich aber hier lediglich um eine Prüfziffer, die sicherstellen soll, dass beim Einlesen – es handelt sich ja hier um den maschinenlesbaren Teil – keine Fehler aufgetreten sind.

Die Berechnung ist ziemlich einfach, und funktioniert auch nicht nach einem geheimen Schlüssel, sondern kann ganz einfach selbst gemacht werden.

Berechnung Prüfziffer

Du kannst nachfolgend selbst die Prüfziffern berechnen, auf den Algorithmus gehe ich weiter unten ein. (Es wird nichts gespeichert oder irgendwohin verschickt, die Berechnung funktioniert auch offline.)

Ausweisnummer: Prüfziffer:
Geburtsdatum (JJMMTT): Prüfziffer:
Gültig bis (JJMMTT): Prüfziffer:
Globale Prüfziffer: Prüfziffer:

Identitätskarte:
 IDCHE{{ idCheckDigitCtrl.partA }}<{{ idCheckDigitCtrl.checksumA }}<<<<<<<<<<<<<<<
 {{ idCheckDigitCtrl.partB }}{{ idCheckDigitCtrl.checksumB }}X{{ idCheckDigitCtrl.partC }}{{ idCheckDigitCtrl.checksumC }}CHE<<<<<<<<<<<{{ idCheckDigitCtrl.globalChecksum }}
 MUSTER<<HANS<MICHAEL<<<<<<<<<<
    
 IDCHE--------<-<<<<<<<<<<<<<<<
 -------X-------CHE<<<<<<<<<<<-
 MUSTER<<HANS<MICHAEL<<<<<<<<<<
    

Pass:
 PMCHEMUSTER<<HANS<MICHAEL<<<<<<<<<<<<<<<<<<<
 {{ idCheckDigitCtrl.partA }}<{{ idCheckDigitCtrl.checksumA }}CHE{{ idCheckDigitCtrl.partB }}{{ idCheckDigitCtrl.checksumB }}X{{ idCheckDigitCtrl.partC }}{{ idCheckDigitCtrl.checksumC }}<<<<<<<<<<<<<<<{{ idCheckDigitCtrl.globalChecksum }}
    
 PMCHEMUSTER<<HANS<MICHAEL<<<<<<<<<<<<<<<<<<<
 <<<<<<<<<<CHE<<<<<<<X<<<<<<<<<<<<<<<<<<<<<<<
    

Die Berechnung ist übrigens für Pass und ID grundsätzlich dieselbe, aber aufgrund der anderen Ausweisnummer ergibt sich dann auch eine andere globale Prüfziffer. Name und Geschlecht (hier X, sonst M oder F) haben keinen Einfluss auf die Berechnung der Prüfziffer.

Algorithmus

Nach einer ersten Recherche auf Wikipedia ist klar, dass die Ausweisnummer und die beiden Daten – Geburtsdatum und Gültigkeitsdatum – jeweils selber schon eine Prüfziffer haben. Die Berechnung für eine Datums-Prüfziffern ist zwar erklärt, für die globale Prüfziffer aber leider zurzeit noch falsch.

Das Prinzip ist grundsätzlich sehr einfach: Es werden alle Zahlen nacheinander mit 7, 3, und 1 multipliziert und dann alles zusammengezählt, und die letzte Stelle der Summe ist die Prüfziffer.

Beispiel Berechnung Prüfziffer eines Datums:

Datum:                 10.06.2019
Format auf der Karte:  190610
Multiplizieren mit:    731731
Ergibt:                7*1 + 3*9 + 1*0 + 7*6 + 3*1 + 1*0
Ergebnis:              79
Prüfziffer:            9

Soweit die Prüfziffern für die beiden Daten. Für die Ausweisnummer funktioniert es nach demselben Prinzip, nur dass für Buchstaben ein numerischer Wert eingesetzt werden muss, und zwar nach dem Prinzip A = 0, B = 1, C = 2, etc.

Globale Prüfsumme

Doch wie lässt sich nun die letzte Ziffer, die globale Prüfziffer berechnen? Geht diese über alles (also mit den bereits berechneten Prüfzifffern) oder nur die reinen “Nutzdaten”? Ich bin dann weiter auf einen alten Rechner gestossen, der aber leider nicht das korrekte Resultat liefert, aber auf eine Seite verweist, wo der fehlende Hinweis versteckt war.

Entscheidend ist, dass die Ausweisnummern früher anscheinend eine Ziffer länger waren, und deshalb die Prüfziffer von der Ausweisnummer auch durch ein < getrennt ist – diese symbolisiert weiter ein Leerzeichen:

C8912345<6

Für die Berechnung muss hier aber eine zusätzliche 0 eingefügt werden, die zwar selbst nichts zur Summe beiträgt, aber den 7-3-1-Zyklus verschiebt, weshalb die resultierende Prüfziffer dann eine ganz andere ist, als wenn man nur die 8-stellige Ausweisnummer selbst nehmen würde

Beispiel Berechnung globale Prüfziffer:

Datengrundlage:      Ausweisnummer mit Prüfz., Geburtsdatum m. P., Gültigkeitsdatum m. P.
Daten:               C89123450 6 880101 8 250101 7
Multiplizieren mit:  731731731 7 317317 3 173173 1
Ergibt:              7*2 (für C) + 3*8 + 1*9 + ... + 7*0 +  3*1 + 1*7
Ergebnis:            332
Prüfziffer:          2

Merci für’s Lesen und frohes Rechnen :-)

adrianus

Coding Algorithms

---

« Older Newer »