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
相关产品推荐
相关产品推荐

