我正在使用Omnikey 5321阅读器与Mifare DESFire EV1标签进行通信。我想读取标准数据文件中的40个字节。我使用Winscard DLL (c++)在ISO7816APDU消息结构中包装本地的desfire命令。
应用程序选择和AES身份验证正常。我对读取数据命令有问题。通信设置设为0x03 (完全加密)。
APDU sended :
0x90 BD 00 00 07 01 00 00 00 28 00 00 00我收到了48个数据字节和"0x9100“状态码。计算用于解密数据的IV:
第一次XOR (0xBD 01 00 00 00 28 00 00 80 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和填充并不总是相同的。
一些帮助是非常有用的
发布于 2014-06-11 08:50:52
好吧,我来猜一猜:你是否在CBC模式下使用AES解密?如果是这种情况,那么您需要正确的IV和正确的密钥才能解密。
如果你有正确的密钥,但是错误的IV,你将能够解密密文,但是解密的明文的前16个字节将是错误的。由于CRC和填充字节不在前16个字节中,即使IV错误,它们也将始终正确。坏的IV只会破坏解密输出的前16个字节。
因此,在数据字节错误的情况下,如果只有前16个字节是错误的,并且如果您使用的是CBC模式,那么这将是有趣的。在这种情况下,看一下静脉输液器。
https://stackoverflow.com/questions/24146635
复制相似问题