HSG |
|
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
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
Vom einfachen Protokoll sollen zunächst nur zwei Befehle genutzt werden.
RST 1 ------------- 0 CLK 1 +---+ 0 ----+ +----
RST 1 0 ------------- CLK 1 +---+ 0 ----+ +----
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!
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)
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