在更改DESFire EV1卡的密钥设置时遇到完整性错误(SW2=30),通常是由于认证失败或数据完整性校验(如MAC)错误所致。以下是逐步解决方案:
认证主密钥:
// 选择PICC主应用(App ID=0x000000)
card.selectApplication(0x000000);
// 使用正确的密钥类型(如AES128)和当前主密钥认证
DESFireKey masterKey = new DESFireKey(KEY_TYPE.AES128, currentMasterKeyBytes);
card.authenticate(0, masterKey);验证密钥设置参数:
newKeySettings值是否合法。例如,确保允许密钥更改(如未将CHANGE_KEY_SETTINGS权限设为禁止)。检查密钥版本和类型:
确保会话状态正确:
调试APDU命令:
处理密钥设置锁定情况:
示例代码修正:
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的构造参数需符合规范(如第一个字节为配置位,第二个为密钥版本)。
举报
更多回帖