0

我正在使用 Omnikey 5321 阅读器与 Mifare DESFire EV1 标签进行通信。我想读取标准数据文件中的 40 个字节。我正在使用 Winscard DLL (c++) 将原生 desfire 命令包装在 ISO 7816 APDU 消息结构中。

应用程序选择和AES认证都OK。我有读取数据命令的问题。通信设置设置为 0x03(完全加密)。

APDU sended :
0x90 BD 00 00 07 01 00 00 00 28 00 00 00

我收到了 48 个数据字节和“0x9100”状态码。使用解密数据计算IV:

我先异或(0xBD 01 00 00 00 28 00 00 80 00 00 00 00 00 00 00)和AES认证后计算的子密钥2)。

然后我使用设置为 0x00 的 Init Vector 和会话密钥对结果进行加密。加密的数据被认为是IV。

我终于解密了用 IV 和会话密钥收到的 48 个数据字节。

I get :
40 data bytes + 4 CRC bytes + 4 padding bytes (0x00 00 00 00)

40 个数据字节有时是好的,但有时是错误的。我不知道为什么它并不总是相同的结果。解密的 CRC 总是相同的,填充也是如此。

当我尝试读取另一个文件中的纯数据时,我没有问题。所以我认为这是有问题的解密。但 CRC 和填充并不总是相同的。

一些帮助会非常有用

4

1 回答 1

1

好吧,我冒险猜测一下:您是否在 CBC 模式下使用 AES 解密?如果是这种情况,那么您需要正确的 IV 和正确的密钥来解密。

如果你有正确的密钥,但错误的 IV,你将能够解密密文,但解密后的明文的前 16 个字节将是错误的。由于 CRC 和填充字节不在前 16 个字节中,因此即使您的 IV 错误,它们也将始终正确。错误的 IV 只会破坏解密输出的前 16 个字节。

因此,有趣的是,在数据字节错误的情况下,如果只有前 16 个字节是错误的,并且您使用的是 CBC 模式。在这种情况下,请查看 IV。

于 2014-06-11T00:50:52.270 回答