NXP MCU 技术论坛
直播中

小组店小二

10年用户 1001经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 EMC/EMI设计 光电显示 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[问答]

更改DESFire EV1卡的密钥设置时出现完整性错误怎么解决?

尝试更改 DESFire EV1 卡上的 PICC 密钥设置时,出现以下错误:com.nxp.NFClib.exceptions.PICCException:完整性错误 SW2 = 30
在 com.nxp.nfclib.desfire.DESFireUtil.invalidResponse(:229)
在 com.nxp.nfclib.desfire.DESFireEV1.changeKeySettings(:879)
以下是导致这种情况的最小示例代码:
public void initNewCard(IDESFireEV1 card) {

    log("连接到读卡器");
    card.getReader().connect();

    log("Starting to init card with id %s, selecting app", Utilities.dumpBytes(card.getUID()));
    card.selectApplication(0);

    String status = card.getAuthStatus();
    log("Current auth status %s", status);

    EV1PICCKeySettings keySettings = (EV1PICCKeySettings) card.getKeySettings();

    log(
            "PICC settings: %s %s",
            String.valueOf(keySettings.isPiccKeySettingsChangeable()),
            String.valueOf(keySettings.isPiccMasterKeyChangeable())
    );

    log("认证");
    default2KDESAuthenticate(card);

    status = card.getAuthStatus();
    log("Current auth status %s", status);

    card.changeKeySettings(makeInUsePICCKeySettings()); // this changeKeySettings() call causes the exception
}

private EV1PICCKeySettings makeInUsePICCKeySettings() {
    EV1PICCKeySettings.Builder builder = new EV1PICCKeySettings.Builder();
    builder.setPiccKeySettingsChangeable(true)
            .setPiccMasterKeyChangeable(true)
            .setAuthenticationRequiredForApplicationManagement(false)
            .setAuthenticationRequiredForDirectoryConfigurationData(false);

    return builder.build();
}
我想恳请您帮助解决这个问题。我尝试过格式化卡片,否则写入它们似乎有效。我做错了什么吗?
相关输出为:
连接到读卡器
开始初始化 ID 为 0x042A43B2EC6A80 的卡,选择 app
当前身份验证状态 未验证
PICC 设置:true true
认证
当前身份验证状态 本机

                                                                                                                                                                                                                                                                                                                                                                                                      

回帖(1)

h1654155275.5614

2025-3-2 13:16:23

在更改DESFire EV1卡的密钥设置时遇到完整性错误(SW2=30),通常是由于认证失败或数据完整性校验(如MAC)错误所致。以下是逐步解决方案:




  1. 认证主密钥



    • 在修改密钥设置前,必须使用当前有效的PICC主密钥进行认证。确保代码中已执行以下步骤:
      // 选择PICC主应用(App ID=0x000000)
      card.selectApplication(0x000000);
      // 使用正确的密钥类型(如AES128)和当前主密钥认证
      DESFireKey masterKey = new DESFireKey(KEY_TYPE.AES128, currentMasterKeyBytes);
      card.authenticate(0, masterKey);




  2. 验证密钥设置参数



    • 检查传递的newKeySettings值是否合法。例如,确保允许密钥更改(如未将CHANGE_KEY_SETTINGS权限设为禁止)。




  3. 检查密钥版本和类型



    • 主密钥的版本号需与卡中当前激活的密钥版本一致。若使用错误的版本,认证会失败。




  4. 确保会话状态正确



    • 修改密钥设置必须在成功认证的会话中进行。确认认证后未执行其他可能终止会话的操作。




  5. 调试APDU命令



    • 使用工具(如PC/SC读卡器调试工具)捕获实际发送的APDU命令,检查数据格式和MAC计算是否正确。




  6. 处理密钥设置锁定情况



    • 若现有密钥设置已禁用更改,需使用更高权限的密钥或联系卡片提供商进行重置。




示例代码修正


public void initNewCard(IDESFireEV1 card) {
    try {
        card.getReader().connect();
        card.selectApplication(0x000000); // 选择PICC主应用
        byte[] currentMasterKey = hexStringToByteArray("00112233445566778899AABBCCDDEEFF");
        DESFireKey piccMasterKey = new DESFireKey(KEY_TYPE.AES128, currentMasterKey);
        card.authenticate(0, piccMasterKey); // 认证主密钥

        // 设置新的密钥配置(例如允许更改密钥设置)
        KeySettings newSettings = new KeySettings(0x0F, 0x01); // 示例参数,需根据需求调整
        card.changeKeySettings(newSettings);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意事项



  • 确保currentMasterKey与卡片当前的主密钥完全一致。

  • KeySettings的构造参数需符合规范(如第一个字节为配置位,第二个为密钥版本)。

  • 若仍失败,建议使用NXP官方工具验证卡片状态,或检查卡片是否处于可配置模式。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分