Encryption NFC通信-Mifare DESFire EV1-AES

Encryption NFC通信-Mifare DESFire EV1-AES,encryption,aes,nfc,mifare,contactless-smartcard,Encryption,Aes,Nfc,Mifare,Contactless Smartcard,我正在使用HID万能5321阅读器与Mifare DESFire EV1标签通信。我想在标准数据文件中写入16个字节。我正在使用WinSCard DLL(C++)以ISO 7816 APDU消息结构包装本机DESFire命令。应用程序选择和身份验证已成功完成,但写入数据命令有问题。 文件的通信设置设置为AES,完全加密 File Nb : 00 Offset : 00 00 00 Length : 10 00 00 (LSB first) Da

我正在使用HID万能5321阅读器与Mifare DESFire EV1标签通信。我想在标准数据文件中写入16个字节。我正在使用WinSCard DLL(C++)以ISO 7816 APDU消息结构包装本机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
我从本机命令计算CRC:

Native command : 3D (File Nb) (Offset) (Length) (Data)
CRC = 7B 8A 60 0F 
然后我使用会话密钥和设置为00的IV进行加密:

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对数据进行异或吗?

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


此外,要注意填充的方式。DESFire EV1数据表对此不明确。虽然AES加密部分建议CMAC填充应始终与AES一起使用,但填充部分指出,具有已知数据长度的命令应填充为全零,而具有未知数据长度的命令应填充为
0x80
,后跟零。最后,关于write命令的文档明确指出,write命令应该用全零填充以进行加密(这是您应该做的)。

只是想一想,CRC是否有不同的字节顺序?libfreefare CRC计算给出了该命令+头+数据的
30 D2 07 00
。另外,至少数据表上说,具有已知数据长度的命令应该只使用
0x00
填充(虽然我不得不承认数据表的不同部分在这里是不明确的,但它明确表示写入命令)。感谢您的帮助,我设法写入数据:我改变了计算CRC的方式,它给了我'30 D2 07 00',我还用'0x00'填充。@VTerrien此编辑似乎与您的初始问题/问题无关,因此您可能希望创建一个新问题,而不是在初始问题中添加新问题。否则,这个问题可能会因为过于宽泛而被关闭。我设法在现有文件中写入数据,但当我在应用程序中创建文件时,我会得到一个“1E”状态代码。我认为可能是IV出错了。我该怎么计算呢?必须将其设置为16000您可能希望了解如何初始化IV。此外,我建议您了解libfreefare实现,因为它可能提供您所需的大部分(全部?)功能。