python smartcard

python - Cómo escribir tarjeta inteligente con pyscard



smartcard (1)

No tengo el hardware para probar esto, pero esto debería ponerte en marcha:

La comunicación con tarjetas inteligentes implica enviar comandos APDU (unidad de datos de protocolo de aplicación de tarjeta inteligente) y recibir respuestas APDU.

Las APDU de comando se envían a través del lector / escritura (su ACR38F) y consisten en un encabezado de 4 bytes seguido de datos (e información sobre el tamaño de los datos y el tamaño de la respuesta)

Field Len Description -------------------------------------------- CLA (1) Instruction Class INS (1) Instruction Code P1-P2 (2) Instruction Parameters Lc (0,1,3) Number of data bytes to follow DATA (*) Data to be transmitted Le (0-3) Maximum response bytes

La respuesta consiste en:

Field Len Description -------------------------------------------- DATA (*) Data to be transmitted SW1-SW2 (2) Command status

En el caso del SLE4418, para escribir datos, los valores deben ser los siguientes:

  • CLA = 00
  • INS = D6
  • P1 = MSB del desplazamiento de la dirección de memoria para almacenar bytes
  • P2 = LSB del desplazamiento de la dirección de memoria para almacenar bytes
  • Lc = longitud de bytes para almacenar
  • DATOS = datos para almacenar
  • Le = (vacío)

Así pues, en código:

WRITE = [0x00, 0xD6] STARTMSB = [0x00] #change to where on the card you would like to write STARTLSB = [0x00] #same here MEM_L = [0x01] DATA = [0x01] cardservice.connection.connect() apdu = READ + STARTMSB + STARTLSB + MEM_L + DATA response1, sw1, sw2 = self.cardservice.connection.transmit( apdu )

Otra información relevante:

Estoy usando el lector / escritor acr38f y mi tarjeta inteligente es SLE4418. ¿Cómo leo y escribo texto en mi tarjeta inteligente?

Por ejemplo: Hello World!

apdu = [0XFF, 0X20,0x00,0x00,0x02, 0x00, 0x00]

respuesta, sw1, sw2 = cardservice.connection.transmit (apdu)

apdu = [0XFF,0xA4,0x00,0x00,0x01,0x05] response, sw1, sw2 = cardservice.connection.transmit( apdu ) apdu = [0XFF,0XB2,0X00,0xA7,0X09] response, sw1, sw2 = cardservice.connection.transmit( apdu ) print response apdu = [0XFF, 0XD0,0x00,0xA7,0x09,0xA7,0x02,0xA7,0x02,0xA7,0x02,0xA7,0x02,0xA7] response, sw1, sw2 = cardservice.connection.transmit( apdu )

respuesta de la tarjeta:

connecting to ACS CCID USB Reader 0 ATR 3B 04 92 23 10 91 > FF 20 00 00 02 00 00 < 00 00 00 90 0 > FF A4 00 00 01 05 < [] 90 0 > FF B2 00 A7 09 < FF FF FF FF FF FF FF FF FF 90 0 [255, 255, 255, 255, 255, 255, 255, 255, 255] > FF D0 00 A7 09 A7 02 A7 02 A7 02 A7 02 A7 < [] 90 0