我正在使用 HID Omnikey 5321 阅读器与 Mifare DESFire EV1 标签进行通信。我想在标准数据文件中写入 16 个字节。我正在使用 WinSCard DLL (C++) 将 Native DESFire 命令包装在 ISO 7816 APDU 消息结构中。
我设法在现有文件中写入数据:
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
我从 Native 命令计算 CRC:
Native command : 3D (File Nb) (Offset) (Length) (Data)
CRC = 30 D2 07 00
然后我使用会话密钥和设置为 00 的 IV 进行加密:
32 bytes data to encipher : (Data) (CRC) 00 00 00 00 00 00 00 00 00 00 00 00
APDU 发送:
90 3D 00 00 27 00 00 00 00 10 00 00 (32 bytes enciphered data) 00
但是当我尝试写入之前创建的文件时遇到问题。
在使用应用程序主密钥进行 AES 身份验证后,我计算了两个子密钥(K1 和 K2)。我将 IV 设置为 0x00...00。然后我创建两个文件:
文件 0
CMAC calculation :
(CD 00 03 00 21 30 00 00 80 00...00) XOR (K2)
encryption with session key and IV
copy of encryption result into IV
APDU sended : 90 CD 00 00 07 00 03 00 21 30 00 00 00
Creation file 0 OK
文件 1
CMAC calculation :
(CD 01 03 00 11 F0 05 00 80 00...00) XOR (K2)
encryption with session key and IV
copy of encryption result into IV
APDU sended : 90 CD 00 00 07 01 03 00 11 F0 05 00 00
Creation file 1 OK
然后我使用 IV 将数据写入文件 0 中进行加密。我收到“1E”错误。
我设法读取现有文件中的数据:
CMAC calculation
(BD 00 00 00 00 10 00 00 80 00...00) XOR (K2)
encryption with session key and IV = 0x00...00
copy of encryption result into IV
我使用 IV 来解密我收到的数据,我得到了很好的字节值。所以我认为子键 K2 是好的。
我不知道我的写入数据命令中的问题在哪里。可能是静脉注射,但我不知道为什么。