HSG

Aktuelle Seite: HSG/Fächer/Informatik/Kryptologie/Chipkarten

Einfache Speicherkarte ST14C02

ATR: 3B 04 49 32 43 2E
+ TS = 3B --> Direct Convention
+ T0 = 04, Y(1): 0000, K: 4 (historical bytes)
+ Historical bytes: 49 32 43 2E
  Category indicator byte: 49 (proprietary format)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 04 49 32 43 2E
	German Health Insurance Card
	"LogCard" from concept2.com (a indoor rower manufacturer)
	I2C card

Intelligente Speicherkarte SLE4442

Interessanterweise erfolgt folgende Ausgabe identisch bei nagelneuen SLE4442-Karte und bei einer Krankenversicherungskarte. Möglicherweise ist die Krankenversicherungskarte eine SLE4442-Karte.

ATR: 3B 04 A2 13 10 91
+ TS = 3B --> Direct Convention
+ T0 = 04, Y(1): 0000, K: 4 (historical bytes)
+ Historical bytes: A2 13 10 91
  Category indicator byte: A2 (proprietary format)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 04 A2 13 10 91
	PM2P Chipkarte SLE 4442, Code FFFFFF
	Bahn BKK (Deutsche Bahn AG - Insurance Company)
	NH Hotels World fidelization card

Telefonkarte

Eine Telefonkarte lässt sich verhältnismäßig einfach auslesen. Im folgenden Versuchsaufbau wird ein USB-Seriell-Umsetzer benutzt, um 5V Versorgungsspannung (rote und schwarze Leitung), die Clock-Leitung CLK (DTR, gelb), die Reset-Leitung RST (RTS, blau) und die Input/Output-Leitung IO (CTS, grün) bereitzustellen. Die Kontaktiereinrichtung stellt dabei die nötigen Kontakte her.

Vom einfachen Protokoll sollen zunächst nur zwei Befehle genutzt werden.

Adresszähler auf Null setzen, Reset
RST  1 -------------
     0

CLK  1     +---+ 
     0 ----+   +----
Adresszähler erhöhen
RST  1 
     0 -------------

CLK  1     +---+ 
     0 ----+   +----

Auslesen einer Telefonkarte

import serial,time
b = ''
s = serial.Serial('/dev/ttyUSB0')
dt = 0.001
# Reset 
s.setDTR(1)         # CLK-Leitung auf 0, Achtung invertiert
s.setRTS(0)         # RST-Leitung auf 1, Achtung invertiert
time.sleep(dt)      # dt warten
s.setDTR(0)         # CLK-Leitung auf 1, Achtung invertiert
time.sleep(dt)
s.setDTR(1)         # CLK-Leitung auf 0, Achtung invertiert
time.sleep(dt)
s.setRTS(1)         # RST-Leitung auf 0, Achtung invertiert
time.sleep(dt)
# Bits lesen
for i in range(1,513):
    if s.getCTS():  # CTS-Leitung auslesen, Achtung invertiert
        b = b + '0'
    else:
        b = b + '1'
    if i%8 == 0:
        b = b + ' '
    # Clock
    s.setDTR(0)     # CLK-Leitung auf 1, Achtung invertiert
    time.sleep(dt)
    s.setDTR(1)     # CLK-Leitung auf 0, Achtung invertiert
    time.sleep(dt)
# Ausgabe
print(b)
# Schnittstelle schließen
s.close()
>>> 
11100010 00100111 01110111 11001010 11010010 01010001 01111000 10110000 00000000 00000000 00000000 00000001
00000011 11111110 00000000 00000001 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000001
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
11100010 00100111 01110111 11001010 

Die gleiche Karte mit ChipLab ausgelesen ergibt:

>>> a
This function does a phonecard analysis. It reads the content of a typical SLExx36
card and parses its information.

Insert card and press enter when ready!

 * Power on card...
 * Resetting card...
 * Reading card...
   ||||||||||||||||
 * Power down card...

The result is:

   e2 27 77 ca   11100010 00100111 01110111 11001010   . ' w .
   d2 51 78 b0   11010010 01010001 01111000 10110000   . Q x .
   00 00 00 01   00000000 00000000 00000000 00000001   . . . .
   03 fe 00 01   00000011 11111110 00000000 00000001   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff 00 01   11111111 11111111 00000000 00000001   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   ff ff ff ff   11111111 11111111 11111111 11111111   . . . .
   e2 27 77 ca   11100010 00100111 01110111 11001010   . ' w .

 * Byte 1: e2 
   Chip type: Eurochip

 * Byte 2: 27 
   Country: Europe

 * Byte 3: 77 
   New card with 10th serial number digit: 7

 * Byte 4: ca 
   Chip fabricator: Unknown

 * Byte 5: d2 
   Nominal Value: 5 Euro
   Invalid last digit of deployment year: 10

 * Byte 6: 51 
   Month of deployment: OKT
 * 9th digit of serial number: 8

 * Byte 7: 78 
   8th digit of serial number: 14
   7th digit of serial number: 1

 * Byte 8: b0 
   6th digit of serial number: 13
   5th digit of serial number: 0

 * Byte 9-13: 00 00 00 01 03 
   Units: 0.10    
   Note units are computed as follows: NumberOfBitsInByte9*4096 + 
                                       NumberOfBitsInByte10*512 + 
                                       NumberOfBitsInByte11*64 + 
                                       NumberOfBitsInByte12*8 + 
                                       NumberOfBitsInByte13*1 = Units 

Analysis done!

ATR der gleichen Telefonkarte

mk@x2:~$ pcsc_scan
PC/SC device scanner
V 1.4.17 (c) 2001-2009, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.5.5
Scanning present readers...
0: FSC SCR USB 2A 00 00

Thu Aug 18 16:33:25 2011
 Reader 0: FSC SCR USB 2A 00 00
  Card state: Card removed, 

Thu Aug 18 16:33:38 2011
 Reader 0: FSC SCR USB 2A 00 00
  Card state: Card inserted, 
  ATR: 3B 04 47 E4 EE 53

ATR: 3B 04 47 E4 EE 53
+ TS = 3B --> Direct Convention
+ T0 = 04, Y(1): 0000, K: 4 (historical bytes)
+ Historical bytes: 47 E4 EE 53
  Category indicator byte: 47 (proprietary format)

Challenge-Response

Challenge-Response-Schema

def crypt(b,s):
    """
    die Bytefolge b (bytes) wird mit dem Schluessel s (bytes) xor-verknuepft,
    noetigenfalls wird s wiederholt
    """
    n = len(b)
    m = len(s)
    return bytes([b[i]^s[i%m] for i in range(n)])

import random

def zufall(n):
    """
    gibt eine zufaellige Bytefolge der Laenge n zurueck
    """
    return bytes([random.randint(0,255) for i in range(n)])

Ablauf einer Authentifizierung auf der Shell nachgespielt

>>> # geheimer Schlüssel
>>> schluessel = zufall(5)
>>> schluessel
b'\xce\x9f\xbe\xd1\xfb'
>>> # Terminal generiert challenge
>>> challenge = zufall(5)
>>> challenge
b'\xb2\rB\xac\xfa'
>>> # Chipkarte generiert response
>>> response = crypt(challenge,schluessel)
>>> response
b'|\x92\xfc}\x01'
>>> # Terminal vergleicht entschlüsselte response mit challenge
>>> crypt(response,schluessel) == challenge
True

Links