Willkommen auf der
U-Key-Seite
Hinweis: Bitte ladet den Schlüssel nicht auf, ohne etwas dafür zu zahlen!!!!



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:
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.

Wie kriege ich die Bytes?

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.

 Die 256 Bytes und den daraus dekodierten Restbetrag kann man mit dem Programm U-Key-Manager bestaunen.
 
 

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]
Redundanz
byte1:=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

Startseite
Home