【问题标题】:NFC communication - Mifare DESFire EV1 - AESNFC 通信 - Mifare DESFire EV1 - AES
【发布时间】:2014-05-13 16:56:14
【问题描述】:

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

然后我使用会话密钥和设置为 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的字节顺序不同?
  • libfreefare CRC 计算给了我30 D2 07 00 用于该命令+标头+数据。另外至少数据表说,具有已知数据长度的命令应该只使用0x00 进行填充(尽管我不得不承认数据表的不同部分在这里是模棱两可的,但它明确说明了写入命令)。
  • 感谢您的帮助,我设法写入数据:我改变了计算 CRC 的方式,它给了我 '30 D2 07 00',我还填充了 '0x00'。
  • @VTerrien 此编辑似乎与您最初的问题/问题无关,因此您可能想要创建一个新问题,而不是向您的初始问题添加新问题。否则,您可能会因为过于宽泛而关闭此问题。
  • 您好,我们正在尝试重新创建您的 CRC32 30 D2 07 00,但不能。您能否提供用于 crc32 的整个序列?还有是 crc32 还是 crc32c?

标签: encryption aes nfc mifare contactless-smartcard


【解决方案1】:

您使用的 CRC 错误。对于您在问题中显示的命令,CRC over command + header + data 应该是30 D2 07 00

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

【讨论】:

  • 我设法在现有文件中写入数据,但是当我在应用程序中创建文件时,我得到“1E”状态代码。
  • 我认为可能是 IV 错误。我应该如何计算它?必须设置为十六 00
  • 您可能需要查看 that answer 以了解如何初始化 IV。此外,我建议您研究 libfreefare 实现,因为它可能提供您需要的大部分(全部?)功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多