You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JCIDE模拟器签名验证正常,实体ACOSJ卡验证失败排查

ECDSA签名验签在实体ACOSJ卡上验证失败问题排查

背景

使用JCIDE开发JavaCard小程序,采用ACOSJ实体卡搭配pyAPDU进行测试。

问题现象

小程序支持ECDSA签名与验签功能,在JCIDE模拟器中测试完全正常:签名后返回数据、签名及W值,验签可成功通过;但加载到实体ACOSJ卡后,无论使用模拟器生成的签名还是实体卡自身生成的签名,验签均返回“未验证”结果(响应00 02)。

日志对比

JCIDE模拟器中,INS=11为签名指令,INS=12为验签指令,验签响应为00 01(验证通过);pyAPDU测试实体卡时,相同验签指令返回00 02(未验证)。

排查情况

  • 已通过JCALgTest确认实体卡支持ALG_ECDSA_SHA_256算法;
  • 模拟器生成的签名长度为72字节,实体卡生成的签名长度为70字节;且实体卡可验证模拟器生成的签名,推测实体卡签名代码生成的签名短2字节。

核心代码片段

// 签名处理逻辑
private void processSign(APDU apdu) throws ISOException {
    byte[] buf = apdu.getBuffer();
    short dataLen = apdu.setIncomingAndReceive();
    
    // 已完成EC密钥初始化
    short sigLength = ecdsaPrivateKey.sign(buf, ISO7816.OFFSET_CDATA, dataLen, buf, (short)0);
    
    apdu.setOutgoingAndSend((short)0, sigLength);
}

// 验签处理逻辑
private void processVerify(APDU apdu) throws ISOException {
    byte[] buf = apdu.getBuffer();
    short totalLen = apdu.setIncomingAndReceive();
    
    // 拆分待验数据与签名(此处假设模拟器签名长度固定为72字节)
    short dataLength = (short)(totalLen - 72);
    boolean verifyResult = ecdsaPublicKey.verify(buf, ISO7816.OFFSET_CDATA, dataLength, 
                                                  buf, (short)(ISO7816.OFFSET_CDATA + dataLength), (short)72);
    
    buf[0] = verifyResult ? (byte)0x01 : (byte)0x02;
    apdu.setOutgoingAndSend((short)0, (short)1);
}

内容的提问来源于stack exchange,提问作者LozCodes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 18:04:56