javax.smartcardio:如何将本机命令发送到 Desfire 卡?

2023-12-10

我正在创建一个 java 应用程序,通过 PC/SC 非接触式读卡器和 javax.smartcardio API 与 Mifare DESFire 卡进行通信。我设法发送常规 ISO 7816 APDU(CLA、INS、P1-P2、Lc、命令数据、Le)。

我已经读过里德里克斯的博客DESFire 卡(至少是我使用的 EV1 版本)支持 APDU 和本机命令其中大多数命令只有 1 个字节长。

例如,“获取版本“ 命令:

Command: 60
Response: af 04 01 01 00 02 18 05

我用以下命令测试了该命令PC/SC 诊断节目来自春卡 (可以在这里找到),我得到了正确的回应。

但我无法使用 javax.smartcardio 发送此命令:此 API 似乎是为创建的real因此 APDU 不允许 1 字节长的命令。

这是我所做的:

public static void main(String[] args){
    TerminalFactory factory = TerminalFactory.getDefault();
    CardTerminals terminalList = factory.terminals();

    try {
        CardTerminal ct = terminalList.list().get(0);       
        ct.waitForCardPresent(0);
        Card card = ct.connect("*");
        CardChannel channel = card.getBasicChannel();

        byte[] command = { 0x60 };

        channel.transmit(new CommandAPDU(command));
    } catch (CardException e) {
        e.printStackTrace();
    }
}

它给了我以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: apdu must be at least 4 bytes long
    at javax.smartcardio.CommandAPDU.parse(Unknown Source)
    at javax.smartcardio.CommandAPDU.<init>(Unknown Source)

我尝试了唯一的(据我所知)其他方式发送命令:

        ByteBuffer command = ByteBuffer.allocate(1);
        command.put((byte) 0x60);

        ByteBuffer response = ByteBuffer.allocate(512);

        channel.transmit(command, response);

并得到类似的错误:

Exception in thread "main" java.lang.IllegalArgumentException: Command APDU must be at least 4 bytes long
    at sun.security.smartcardio.ChannelImpl.checkManageChannel(Unknown Source)
    at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source)
    at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source)

您知道使用 javax.smartcardio 或其他方式发送此类命令的任何方法吗?

我知道有可能wrap这些命令,但我更喜欢使用(更简单的)本机命令。

Thanks.


javax.smartcardio是为使用 ISO 7816-4 命令而编写的 API。因此不可能发送“本机”命令。基本上,本机命令可以是任何内容,因此很难支持这些命令。

您要么恢复到 JNI,要么尝试找到使用的东西transmitControlCommand。但恐怕没有额外的库就没有真正使用 DESFire 的方法。

我个人认为使用包裹层要容易得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javax.smartcardio:如何将本机命令发送到 Desfire 卡? 的相关文章

随机推荐

  • 使用Python多处理在worker之间共享变量[重复]

    这个问题在这里已经有答案了 如何读取和更新Python中多个worker之间共享的变量 例如 我正在使用 Python 中的多个进程扫描文件列表 并且想检查父目录是否已被扫描 def readFile filename Add the pa
  • R中Leaflet中聚集标记的聚合加权线串

    我正在尝试绘制位置和加权连接线串 当我放大或缩小时 标记的聚类会调整得很好 显示的集群标签是聚合的node val的标记 我想对线串做类似的事情 这样 该图不显示连接单个标记的蓝线 而是显示连接标记簇的线 并且 连接标记簇的新线串的宽度根据
  • 如何访问(转发)docker compose 网络内的公共 HTTP 请求 IP 地址?

    通过以下设置 只有 YARP 容器已发布端口 它正确设置了X Forward 供其他容器使用的标头 但不幸的是它是 docker compose 网关地址 当我想记录 公共 客户端的 IP 地址时 我得到 ffff 172 18 0 1这是
  • 如何创建具有依赖注入和接口的连接类?

    我正在读这个问题 PHP 多个不同的数据库依赖注入类 最佳答案 我理解这里使用接口背后的概念 但我不知道如何使用它 这是最重要的答案 抱歉 如果我不应该将其复制到这里 您应该首先为所有数据库操作创建一个接口 interface IDatab
  • d3 v4嵌套数据和堆积条形图

    I am trying to make a chart that looks like this 我有一个 D3 nest 数据结构 如下所示 key Area 1 values key 5 Validation Complete valu
  • Extjs 4通过ajax调用下载文件

    问题很简单 当我提交表单时 我必须下载一个文件 这是提交表单时的一个ajax调用 它允许我使用从表单 服务器端获取的数据构建一个文件 然后将其作为链接到警报 事实上 我的老板希望直接下载文件 而不是通过警报中的链接 所以我必须确保该文件可通
  • 如何在单元格更改上执行 JTable 选择所有文本

    我看过一些这样做的例子 但我仍然无法理解并且无法实现它 我想做的是单元格更改 焦点 下一个选定的单元格将选择所有文本 准备好让用户完全更改它 关于如何做有什么想法吗 更新 不知怎的 我设法完成了以下课程 但是 实施这个tblLayers s
  • 如何打印java txt文件中的列

    我正在尝试在一个 txt 文件上打印多个数组 其中有一个数组打印 然后有另一列装箱并有另一个数组打印 我如何格式化它才能工作 我不记得执行此操作的格式化命令 我需要所有列对齐 现在我有这个 private static void makeF
  • 包装python超类的所有方法

    如果我无法更改超类的代码 有没有办法包装超类的所有方法 作为一个最小的工作示例 请考虑这个基类Base 它有许多返回自身新实例的方法 以及派生类Child class Base def init self val self val val
  • Javascript appendChild onload 事件

    我将动态创建的图像元素附加到文档中 var img new Image img src test jpg img onload function var addedImg container appendChild img console
  • 基于 @AspectJ 的 Spring 3.1 AOP

    我正在尝试使用 Spring 3 1 运行基于 AspectJ 的 AOP 但无法正确配置切入点 切入点和建议方法是 切入点 Pointcut execution point public void selectAll 建议后 After
  • IMPORTHTML 或 IMPORTXML 从站点收集数据

    我已经多次尝试收集此表中的数据 我评论的两个函数的简单方法 我都尝试过 但没有成功 我想知道是否有人知道在 Google 表格中收集这些数据的任何其他方法 网站链接 https www onlinebettingacademy com st
  • 从 CSV 加载时 PostgreSQL/JooQ 批量插入性能问题;我该如何改进流程?

    For 这个项目 我打算制作一个 Web 版本 现在正在制作一个 PostgreSQL 9 x 后端 Web 应用程序将从该后端进行查询 现在 跟踪器会生成一个包含两个 CSV 的 zip 文件 在运行时将其加载到 H2 数据库中 其架构如
  • default(object); 是什么意思?在 C# 中做什么?

    谷歌搜索只是找到了关键字 但我偶然发现了一些代码 上面写着 MyVariable default MyObject 我想知道这意味着什么 对于引用类型 它返回null 对于除以下以外的值类型Nullable
  • 将 CSV 文件导入为 Pandas DataFrame

    我如何阅读以下内容CSV文件到 Pandas 中DataFrame Date price factor 1 factor 2 2012 06 11 1600 20 1 255 1 548 2012 06 12 1610 02 1 258 1
  • 使用 Intellij 和 DB Navigator 的 Java 代码中的 SQL 语句错误

    我在intellij IDE中使用mysql 我已经安装了 DB Navigator 并成功测试了我的连接 我已经使用 mysql workbench 成功创建了一个数据库 并且能够在 IDE 上看到数据库 文件目录 如下图所示 Howev
  • 如何使用 WCF 签署 SOAP 请求

    我有一个第三方 SOAP Web 服务 我需要调用它的方法之一 该请求需要签名 我如何签署请求 我假设签名意味着您使用客户端安装的证书对消息进行签名 在 WCF 中执行此操作相对容易 假设您正在使用wsHttpBinding in the
  • 将数据 URI 格式的文件从浏览器拖到桌面

    As 这篇博文指出 有一种方法可以通过从浏览器拖放到桌面来下载文件 我想将数据 uri 格式的文件 例如 data application octet stream base64 eNcoDEdFiLEStuFf 拖到桌面 由于安全原因 文
  • 使用 c# 使用 Drupal Rest Api

    我正在努力使用 c 使用 Drupal Rest Api 我正在使用 drupal 7 5 并利用它的其余服务 API 来跟踪各种资源 我已经成功地通过谷歌的邮递员发布了内容 但是当我尝试使用 c 代码复制它时 系统提示我出现禁止错误 匿名
  • javax.smartcardio:如何将本机命令发送到 Desfire 卡?

    我正在创建一个 java 应用程序 通过 PC SC 非接触式读卡器和 javax smartcardio API 与 Mifare DESFire 卡进行通信 我设法发送常规 ISO 7816 APDU CLA INS P1 P2 Lc