NFC通信 - Mifare DESFire EV1 - AES

时间:2014-05-13 16:56:14

标签: encryption aes nfc mifare contactless-smartcard

我正在使用HID Omnikey 5321阅读器与Mifare DESFire EV1标签进行通信。我想在标准数据文件中写入16个字节。我正在使用WinSCard DLL(C ++)在ISO 7816 APDU消息结构中包装Native DESFire命令。应用程序选择和身份验证已成功完成,但我在写入数据命令时遇到问题。 文件的通信设置设置为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

我从Native命令计算CRC:

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

然后我用会话密钥和IV设置为00加密:

32 bytes data to encipher : (Data) (CRC) 80 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

作为响应,我收到“1E”状态代码,表示CRC或填充错误。我不知道问题出在哪里,AES加密算法似乎很好,因为我设法读取数据。

可能是CRC或IV。我是否必须使用CMAC XOR数据?

1 个答案:

答案 0 :(得分:2)

您使用的CRC错误。对于您在问题中显示的命令,CRC over命令+标题+数据应为30 D2 07 00

此外,请注意填充方式。 DESFire EV1数据表很不明确。虽然关于AES加密的部分建议CMAC填充应始终与AES一起使用,但填充部分指出具有已知数据长度的命令应填充全零,而具有未知数据长度的命令应填充{{1}然后是零。最后,关于write命令的文档明确指出write命令应填充所有零加密(以及你应该做的事情)。