2014-05-13 4 views
2

J'utilise un lecteur HID Omnikey 5321 pour communiquer avec une étiquette Mifare DESFire EV1. Je veux écrire 16 octets dans un fichier de données standard. J'utilise la DLL WinSCard (C++) pour encapsuler la commande native DESFire dans la structure de message APDU ISO 7816. La sélection de l'application et l'authentification sont réussies mais j'ai un problème avec la commande Write Data. Les paramètres de communication du fichier sont définis sur AES, entièrement chiffrés.Communication NFC - Mifare DESFire EV1 - AES

File Nb   : 00 
Offset   : 00 00 00 
Length   : 10 00 00 (LSB first) 
Data (16 bytes) : 23 00 00 00 00 00 00 08 12 34 56 78 00 00 00 00 

Je calcule le CRC de la Native Command:

Native command : 3D (File Nb) (Offset) (Length) (Data) 
CRC = 7B 8A 60 0F 

Je Chiffrer avec la clé de session et un ensemble IV 00:

32 bytes data to encipher : (Data) (CRC) 80 00 00 00 00 00 00 00 00 00 00 00 

APDU sended:

90 3D 00 00 27 00 00 00 00 10 00 00 (32 bytes enciphered data) 00 

En réponse, je reçois un "1 E "code d'état qui signifie CRC ou erreur de remplissage. Je ne sais pas où est le problème, l'algorithme de cryptage AES semble être bon parce que je parviens à lire les données.

Il peut s'agir du CRC ou de l'IV. Dois-je des données XOR avec le CMAC?

+0

Juste une pensée, pourrait-il être que le CRC a un ordre des octets différent? –

+0

Le calcul du CRC libfreefare m'a donné '30 D2 07 00' pour cette commande + en-tête + données. Au moins la feuille de données indique, que les commandes avec la longueur de données connues devraient utiliser seulement 0x00 pour le remplissage (bien que je dois admettre que les différentes sections de la feuille de données sont ambiguës, mais c'est explicitement l'état pour la commande d'écriture). –

+0

Merci pour votre aide, je parviens à écrire des données: je change la façon dont je calcule CRC et il m'a donné '30 D2 07 00 ', je touche aussi avec' 0x00 '. – VTerrien

Répondre

2

Le code CRC que vous utilisez est incorrect. Pour la commande que vous affichez dans votre question, la commande CRC over + header + data doit être 30 D2 07 00. En outre, faites attention à la façon dont vous devez faire le rembourrage. La fiche technique DESFire EV1 est ambiguë sur ce point. Alors que la section sur le cryptage AES suggère que le remplissage CMAC doit toujours être utilisé avec AES, la section sur le remplissage indique que les commandes avec une longueur de données connue doivent être complétées avec des zéros, tandis que les commandes avec une longueur inconnue doivent être complétées par 0x80 . Enfin, la documentation sur la commande d'écriture indique explicitement que la commande d'écriture doit être complétée avec tous les zéros pour le chiffrement (et c'est ce que vous êtes censé faire).

+0

Je parviens à écrire des données dans un fichier existant mais lorsque je crée un fichier dans une application, j'obtiens un code d'état "1E". – VTerrien

+0

Je pense que ce peut être le IV qui est faux. Comment devrais-je le calculer? Doit-il être réglé à seize 00 – VTerrien

+0

Vous pouvez regarder dans [cette réponse] (http://stackoverflow.com/questions/20503060/how-to-decrypt-the-first-message-sent-from-mifare-desfire -ev1/20504667 # 20504667) sur comment initialiser l'IV. De plus, je vous suggère de vous pencher sur l'implémentation de libfreefare car cela pourrait fournir la plupart (toutes?) Les fonctionnalités dont vous avez besoin. –

Questions connexes