|
|
![]() |
|
Ihr habt euch sicherlich auch schon einmal gefragt, was hinter diesem
Schlüssel steckt? Für alle, die es genau wissen wollen, ist diese
kleine Seite.
Ich habe mir die Frage jedenfalls auch gestellt, und versucht, einiges
darüber herauszufinden, leider gab das eigentlich so unerschöpfliche
Internet nur sehr wenig Informationen über den U-Key preis. Als erstes
war die Anschlussbelegung das erste Geheimnis, das zu knacken galt.
Wo liegt Plus und wo Minus?
Dafür gibt es zwei Methoden:
- Messung:
Wie kriege ich die Bytes?Normalerweise besitzen Anschlüsse, die Betriebsspannung führen, eine größere Fläche. Dies nutzt man nun aus und mißt die Kapazität zwischen einen Anschluß und einer Alu-Folie, die um den Schlüssel gewickelt ist. Dabei kommen Unterschiede von weinigen pF heraus. Weiter nutzt man aus, das IC´s mit Schutzdioden ausgestattet sind, die gefährliche Fehlspannunugen abblocken sollen. Dabei nimmt man eine Spannung von einigen Volt, schließt einen hochohmigen Widerstand (mind. 200 KOhm) in Reihe und schließt den Kreis mit zwei Anschlüssen des Schlüssels. Das Ergebnis ist eine fast eindeutige Lage der Betriebsspannung:- Schlüssel öffnen:
Zugegeben, eine rabiate Methode, aber man sieht viel :-)
![]()
links, rechts befinden sich die Betriebsspannungsanschlüsse.
Wenn man sich schon ein bißchen mit Chipkarten beschäftigt hat, kennt man schon einige Kommunikationsprotokolle. Ein Bus der nur zwei Leitungen benötigt ist zum Beispiel der IIC-Bus oder I^2C-Bus von Phillips [1]. Eine sehr gute Beschreibung des IIC-Protokolls findet man auch in [2]. Da der Schlüssel nur noch zwei freihe Anschlüsse besitzt, dachte ich mir, probier´s doch einfach mal damit. Ein erster Versuch mit einem Chipkartenleser aus [3] schlug leider fehl (damals hatte ich einfach die Betriebsspannung vergessen einzuschalten). Bei einem zweiten Versuch in den letzten Weinachtsferien konnte ich dann die ersten Bytes über den Bildschirm purzeln sehen.(Die Belegung von SDA und SCL muß man nartürlich ausprobieren).
Als soweit alles funktionierte mußte dann auch noch
eine eigene Schaltung und ein eigenes Programm her. Für die Hardware
habe ich einen geänderten Aufbau aus [3] übernommen. Es gibt
zwar IIC-Interfaces mit zig Bauteilen zu hauf, aber am liebsten mag ich
es schön einfach. Wenn der Lesevorgang nicht korrekt funktioniert,
dann kann der LPT-Port nicht den benötigten Betriebsstrom (knapp 1.5
mA) liefern. In dem Fall muß man auf ein externes Netzteil zurückgreifen.
![]() |
![]() |
Das Programm benutzt den Druckerport LPT1, funktioniert garantiert auch unter WindowsNT und unterstützt die obige Hardware. Die Platine sieht zwar nicht besonders gut aus, aber wenigstens "wackeln" keine Drähte.

Formate, Formate
Ein weiteres Problem, von dem ich dachte, es wäre simpel, ist das Format, mit dem die Informationen gespeichert sind. Bis jetzt habe ich folgendes für das Dresdener-Ukey-Format herausgefunden (einige Tage habe ich dafür geopfert):
- Byte $30, $31, $38, $39, $3F ändern sich bei einem Buchungsvorgang- für den Geldbetrag gilt: Betrag=(byte[$30] xor byte[$40])*256+(byte[$31] xor byte[$41]) in Pfennig
- für die Schlüsselnummer gilt: Nummer=(byte[$32] xor byte[$42])*256+(byte[$33] xor byte[$43])
- 1.Zeile: byte[$00]=konst=14, byte[$04]=konst=16, byte[$01] ... [$03]; [$05]..[$07] keine Vorschrift jedoch:
byte[$08]=byte[$00] xor byte[$01], byte[$09]=byte[$01] xor byte[$02] usw; byte[$0F]=byte[$00] xor byte[$07]- 2.Zeile: keine Vorschrift
- 3.Zeile: 2.Zeile xor 3.Zeile ergibt Spaltenweise: 0 3 5 0 0 6 4 0 3 6 5 0 6 2 4 0
- 7.Zeile: bis Spalte 07: 6.Zeile xor 7.Zeile ergibt Spaltenweise 248
- eine Speicherstelle im Datenteil ist mit Nachbarstellen im Datenteil und der Speicherstelle im Redundanzteil folgendermaßen verknüpft:
Datenbyte1:=byte[x] ; Datenbyte2:=byte[(x+1) mod 8]; Datenbyte3:=byte[x+16]; Datenbyte4:=byte[((x+1) mod 8) +16]
Redundanzbyte1:=byte[x+8]; Redundanzbyte2:=byte[x+8+16]
x:=($00..$07)*16+32
Verknüpfung:
Redundanzbyte1:=Datenbyte1 xor Datenbyte2 xor Datenbyte3 xor Datenbyte4 xor Redundanzbyte2
In Worten: Byte xor (Nachbarbyte rechts) xor (Nachbarbyte unten) xor (Nachbarbyte rechts unten):= Redundanzbyte xor (Redundanzbyte unten)
Redundanzbyte:=Datenbyte+8; wenn Nachbarbyte rechts>8 dann Nachbarbyte rechts:=0
Kostenlos Essen? Wir wollen mal nicht übertreiben!
Sicherlich ist es kein Problem, den Schlüssel aufzuladen. Das einfachste wäre: man beschreibt den Schlüssel mit einem vorher gesicherten Dump immer wieder neu. Wenn man das vollständige Format kennt, könnte man sogar den U-Key wahlweise beschreiben, aber wir wollen doch ehrlich bleiben.
Jedenfalls möchte ich hiermit
darauf hinweisen, das ich die Informationen dieser Seite nur für den
Experimentiergebrauch zu Verfügung stelle, Mißbrauch ist nicht
meine Absicht.
Quellenverweise:
[1] IIC-Bus von Philips[2] c´t 1994 Heft 12; Seite 310
[3] Elektor 9/97; Chipkarten Lese- und Schreibgerät