使用TapLinx操作DESFire EV3时changeKey()返回Integrity Error SW2=30
MIFARE DESFire EV3卡片调用changeKey()返回Integrity Error SW2=30问题
问题场景
在Android平台(Android Studio + Kotlin)通过IsoDep传输,使用NXP TapLinx SDK的IDESFireEV1接口操作MIFARE DESFire EV3卡片:
- 已成功执行:PICC认证、
formatPICC()、createApplication()、selectApplication() - 执行失败:调用
changeKey()时返回Integrity Error SW2=30
目标需求
- 创建DESFire EV3应用
- 修改应用主密钥(密钥0)
- 使用新密钥完成认证
相关代码
private fun createApplication() { val s = EV1ApplicationKeySettings.Builder() .setAppMasterKeyChangeable(true) .setAppKeySettingsChangeable(true) .setAuthenticationRequiredForFileManagement(true) .setAuthenticationRequiredForDirectoryConfigurationData(true) .setMaxNumberOfApplicationKeys(3) .setKeyTypeOfApplicationKeys(KeyType.TWO_KEY_THREEDES) .build() desfire.createApplication(AID, s) detail(" createApplication: AID=${AID.toHex()}, type=$KEY_TYPE, numKeys=3") } // 失败的调用 desfire.changeKey(keyNo, KeyType.TWO_KEY_THREEDES, oldKey, newKey, 0x00)
Logcat报错信息
Integrity Error SW2 = 30 com.nxp.nfclib.desfire.DESFireUtil.invalidResponse(:260) com.nxp.nfclib.desfire.DESFireResponse.invalidResponse(:174) com.nxp.nfclib.desfire.DESFireEV2.changeKeyCommandTransfer(:1034) com.nxp.nfclib.desfire.DESFireEV1.changeKeyHelper(:1215) com.nxp.nfclib.desfire.DESFireEV2.changeKey(:851)
排查与解决方案
1. 校验密钥长度与格式
KeyType.TWO_KEY_THREEDES要求密钥长度必须为16字节(两个8字节DES密钥拼接),检查oldKey和newKey是否符合该长度,避免使用8字节单DES密钥或其他非法长度。
2. 确认应用级认证状态
修改应用主密钥(密钥0)必须先通过该应用的密钥0完成认证,而非仅完成PICC级认证。在调用changeKey()前,需补充应用认证步骤:
// 选择应用后,先使用当前应用密钥0完成认证 desfire.authenticate(0, KeyType.TWO_KEY_THREEDES, oldKey) // 再执行密钥修改 desfire.changeKey(0, KeyType.TWO_KEY_THREEDES, oldKey, newKey, 0x00)
3. 检查changeKey参数合法性
- 确认
keyNo确实为0(应用主密钥的编号) - 最后一个参数
keySettings(传入0x00)需符合应用密钥设置:创建应用时已开启setAppMasterKeyChangeable(true),该参数需与密钥的权限配置匹配,若无需修改密钥设置,可保持0x00,但需确保该值未违反卡片的密钥权限规则。
4. 适配DESFire EV3特性
虽然使用IDESFireEV1接口兼容EV3,但可尝试切换至DESFireEV2接口调用changeKey(),避免EV3特有的密钥版本或权限逻辑导致的兼容性问题。
5. 确认初始密钥正确性
formatPICC()后卡片PICC密钥为默认值,创建应用时若未指定初始密钥,应用的密钥0默认是16字节全0密钥,需确保oldKey与该初始密钥一致。
内容的提问来源于stack exchange,提问作者sai kumar




