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

无法用smartcard库复现Wireshark智能卡数据传输 请求协助

解决Smartcard库模拟APDU传输与Wireshark捕获不一致的问题

看起来你在使用JavaScript的smartcard库模拟智能卡APDU命令时遇到了匹配问题,我来帮你梳理下可能的问题点和修正方案:

核心问题分析

你要模拟的APDU命令是00 B0 01 94 64(Read Binary命令,读取100字节数据),但当前代码的参数配置可能和库的预期格式不匹配,导致发送的命令和Wireshark捕获的不一致。

修正方案1:直接使用原始字节数组构造APDU(最可靠)

避免手动拆分CLA/INS/P1/P2/LE字段可能带来的错误,直接用Wireshark捕获到的原始字节数组来构造CommandApdu,这是最能保证一致性的方式:

// 直接使用Wireshark捕获到的完整APDU字节序列
const commandApdu = new CommandApdu({ bytes: [0x00, 0xB0, 0x01, 0x94, 0x64] });

card.issueCommand(commandApdu)
  .then(response => {
    // 正确解析响应(不要直接打印对象,提取关键数据对比)
    console.log("APDU响应十六进制:", Buffer.from(response.bytes).toString('hex'));
    console.log("响应状态码:", response.statusCode.toString(16).toUpperCase());
  })
  .catch(error => {
    console.error("命令执行失败:", error);
  });

修正方案2:修复字段式构造的参数错误

如果你坚持用字段拆分的方式构造,需要注意两个关键点:

  1. size字段是错误的:这个APDU总长度是5字节(CLA+INS+P1+P2+LE),所以size应该是0x05,而非0x04
  2. 部分库版本不需要手动指定size,会自动计算,可直接省略

修正后的代码:

const apduObj = {
  cla: 0x00,
  ins: 0xB0,
  p1: 0x01,
  p2: 0x94,
  le: 0x64
  // 省略size字段,让库自动计算;如果必须指定,设置为0x05
};
const commandApdu = new CommandApdu(apduObj);

// 发送前验证构造的APDU是否正确
console.log("构造的APDU字节:", Buffer.from(commandApdu.toBytes()).toString('hex'));

card.issueCommand(commandApdu)
  .then(response => {
    console.log("APDU响应十六进制:", Buffer.from(response.bytes).toString('hex'));
  })
  .catch(error => {
    console.error("命令执行失败:", error);
  });

额外验证步骤

  1. 在发送命令前,打印commandApdu.toBytes()的十六进制字符串,和Wireshark捕获的发送数据对比,确保完全一致
  2. 处理响应时,提取响应字节的十六进制格式,和Wireshark中的响应数据对比,避免直接打印对象导致的信息缺失

内容的提问来源于stack exchange,提问作者P.Paruba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:19:05