我正在使用 HID Omnikey 5321 读卡器与 Mifare DESFire EV1 标签进行通信。我使用 WinSCard DLL(C++ 语言)将 Native DESFire 命令包装在 ISO 7816 APDU 消息结构中。在标签上,我有一个带有 3 个键的应用程序。由于密钥设置设置为 0x0B,我使用应用程序主密钥进行身份验证以更改密钥值。
我设法更改应用程序主密钥,但无法更改密钥 1 和 2。
使用应用程序主密钥进行 AES 身份验证后,我尝试更改密钥 2 :
Old Key 2 = 00...00
New Key 2 = 22...22
我通过(旧密钥 2)XOR(新密钥 2)计算 CRC
CRCxor = F1 4A D1 C0
我通过 Native Command 计算 CRC
Native Command = C4 02 (New Key 2)
CRCnc = C9 1F 03 80
然后我使用会话密钥和 IV 设置为 00 进行加密
32 bytes data to encipher : (New Key 2 XOR Old Key 2) (CRCxor) (CRCnc) 00...00
APDU 已发送
90 C4 00 00 21 02 (enciphered data) 00
作为响应,我收到“1E”状态代码,这意味着 CRC 或填充错误。
我也尝试不对数据进行异或。我只是附加通过 Native Command 计算的 CRC,就像我成功更改主密钥所做的那样,但我仍然有相同的错误。
我不知道问题出在哪里。
九年多后 - 我在使用 Omnikey 5022 读卡器时遇到了同样的问题。
我使用 SK-AD3 发卡器更改了正在使用的卡的密钥,使用 Omnikey 设备发出相同的 APDU 例程来更改卡的密钥会产生 91 1E、CRC/MAC 错误。如果我猜的话,我会说 Omnikey 阅读器本身的硬件中发生了一些问题,导致了此错误。我浏览了该设备的软件开发指南,但找不到任何相关内容。确实没有任何理由认为相同的 APDU 应该在一台设备上工作,而不能在另一台设备上工作。
基本上,Omnikey 设备上的 C4 命令有问题。 APDU 本身坚如磐石。