You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mifare Desfire Ev2创建事务MAC文件报SW2=-98参数错误求助

问题原因定位

你遇到的SW2=-98错误是Java有符号byte类型转十进制的显示结果,将其与0xFF做与运算转无符号值后为0x9E,对应DESFire EV2卡的标准错误码参数值非法,核心问题是事务MAC文件配置参数的语义不匹配,具体排查和修复方案如下:


排查修复步骤
  • 核心错误:tmKeyOption参数与传入密钥参数不匹配
    这是触发该错误的最常见原因:

    • tmKeyOption=0x00的语义是「创建文件时直接引用卡片内已预先存储的TM密钥」,该模式下卡不会接收外部传入的密钥值,要求传入的tmKey参数必须是长度为0的空数组(即new byte[0]),你当前传入了16字节的全0密钥数组,参数长度不符合卡的协议要求,直接触发参数错误。
    • 如果你需要在创建事务MAC文件时同步写入新的TM密钥(也就是你代码里写的全0 AES128密钥),需要将tmKeyOption取值改为0x01,该模式下卡才会接收并校验你传入的tmKey和tmKeyVersion参数。
  • 权限配置逻辑错误
    你当前将writeAccess设为0x0F,根据DESFire权限编码规则,0x0F代表「永久禁止该操作」,事务MAC文件需要支持写入更新MAC值,该配置会导致文件创建后无法正常使用。测试阶段可以先设为0x0E(无需认证即可访问),正式使用时改为对应授权密钥的编号(如0x00代表0号密钥认证后可写)。

  • 前置操作校验
    创建事务MAC文件前,需要先完成当前所在应用的Change权限认证(默认对应应用的0号密钥),未认证状态下创建文件会触发权限错误,但不会返回0x9E参数错误,可在修复前两个问题后再校验认证状态。

  • 调试优化建议
    调试时不要直接打印有符号类型的SW状态字,通过String.format("0x%02X", swValue & 0xFF)转成无符号十六进制打印,可直接对应NXP官方协议文档的错误码表,大幅提升定位效率。


修正后的参考代码(创建文件时写入新TM密钥场景)
public static final byte[] KEY_AES128_00_DEFAULT =
            {
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
            };
DESFireFile.Ev2TransactionMacFileSettings fileSettings = new DESFireFile.Ev2TransactionMacFileSettings(
                    IDESFireEV2.CommunicationType.MAC,     // 安全类文件建议使用MAC及以上通信等级,避免明文篡改
                    (byte) 0x00,                            // readAccess:0号密钥认证可读
                    (byte) 0x0E,                            // writeAccess:测试阶段设为自由访问,正式环境替换为对应密钥号
                    (byte) 0x00,                            // readWriteAccess
                    (byte) 0x00,                            // changeAccess
                    (byte) 0x01,                            // tmKeyOption:创建文件时加载新TM密钥
                    KEY_AES128_00_DEFAULT,                  // tmKey:待加载的AES128密钥
                    (byte) 0x00);                           // tmKeyVersion

如果你是要使用卡上已存在的TM密钥,只需要把tmKeyOption改回0x00,tmKey参数传入new byte[0]即可,不需要传入实际密钥值。

内容的提问来源于stack exchange,提问作者eT4aa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:06:26