2016-09-08 6 views
1

Je viens récemment de me lancer dans la programmation de cartes à puce. J'utilise le lecteur Gemalto Prox-SU et j'ai plusieurs cartes MIFARE Classic 1k vierges disponibles, sur une machine Ubuntu 16.04. J'ai installé le lecteur Gemalto Prox-SU et j'ai demandé au lecteur de détecter une carte via un script en python en utilisant Ludovic Russeau's pyscard.Comment accéder aux blocs de mémoire MIFARE 1k avec le lecteur Gemalto Prox-SU?

J'ai réussi à écrire un script qui envoie des APDU à la connexion lecteur/carte. Je peux lire ATR, envoyer la commande GetData pour lire le numéro de série de la carte et essayer d'envoyer plusieurs APDU à la carte pour essayer de lire les blocs de mémoire de la carte. Mis à part les commandes LoadKey, cependant, tout le reste renvoie "0x6982: état de sécurité non satisfait"

Je sais que je suis supposé envoyer une commande d'authentification générale avant chaque lecture et écriture, comme indiqué dans le manuel, mais même l'authentification générale commande retourne "l'état de sécurité non satisfait". D'après ce que j'ai lu, cela devrait être très simple. Qu'est-ce que je rate? Comment configurer mon script pour que l'authentification réussisse et que je puisse lire les données des blocs de mémoire?

Répondre

0

Le flux typique pour la lecture des cartes MIFARE 1K classique avec le lecteur Prox-SU (voir le manual) est:

  1. Chargez une clé d'authentification. Par exemple, si votre carte est lisible en utilisant la clé A avec la valeur par défaut (« clé de transport ») FF FF FF FF FF FF, utilisez la commande LOAD clé suivante:

     
    FF 82 00 50 06 FFFFFFFFFFFF 
         ^^ ^^ ^^^^^^^^^^^^ 
         | |    \-- Key 
         | | 
         | \------------------ Key slot 80 (0x50) 
         | 
         \--------------------- Key in RAM (0x00) 
    

    Cette stocke la FF FF FF FF FF FF clé dans la première rainure de clavette (0x50) dans la mémoire volatile (RAM) du lecteur. Authentifier à un secteur à l'aide de la commande GENERAL AUTHENTICATE. Eventhough vous authentifiez à l'ensemble du secteur que vous devez aborder le secteur par un numéro de bloc (généralement le premier bloc du secteur):

     
    FF 86 00 00 05 01 0004 60 50 
            ^^^^ ^^ ^^ 
            | | \-- Key slot 80 (0x50) 
            | | 
            | \----- Key type (0x60 = Key A, 0x61 = Key B) 
            | 
            \-------- Block number (block 4) 
    
  2. Enfin, vous pouvez lire un bloc en utilisant la commande READ BINARY:

     
    FF B0 0004 10 
         ^^^^ 
         \-------- Block number (block 4) 
    

Si vous recevez un code d'état 69 82 pendant GENERAL AUTHENTIQUE, fort probablement indique que vous essayez de vous authentifier avec une clé incorrecte.

+0

Vous avez dit "si votre carte est lisible avec la clé A avec la valeur par défaut (" clé de transport ") FF FF FF FF FF FF, vous utiliserez la commande LOAD KEY suivante". Cela a fonctionné et, pour ce qui est de ma question initiale, cela a réglé mes problèmes. Cependant, que s'il y a un nouveau problème. Comment saurais-je si la carte est lisible avec keyA seule? Est-ce quelque chose que je peux définir plus tard? –

+0

@GugaFigueiredo Chaque secteur a deux clés (touche A et touche B). Les blocs dans chaque secteur peuvent être configurés pour être lisibles et/ou inscriptibles par la touche A ou la touche B. Les clés et les bits qui configurent les conditions d'accès sont stockés dans le dernier bloc de chaque secteur (la "remorque de secteur"). La bande-annonce du secteur est accessible comme n'importe quel autre bloc (à l'exception que la valeur des clés est masquée à partir des données renvoyées lors d'une commande de lecture). –