You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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密钥拼接),检查oldKeynewKey是否符合该长度,避免使用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

火山引擎 最新活动