使用 ACR38 读卡器从 SLE 4442 智能卡读取数据

Posted

技术标签:

【中文标题】使用 ACR38 读卡器从 SLE 4442 智能卡读取数据【英文标题】:Reading data from SLE 4442 smart card using ACR38 Card Reader 【发布时间】:2016-02-27 23:27:53 【问题描述】:

我正在开发一个项目,以读取和写入 SLE 4442 智能卡的数据。我使用的读卡器是来自ACS 的 ACR38。按照他们的APDU commands,我可以访问卡并读取一些数据。但我怀疑我仍然无法读取里面的确切数据。这是因为,每当我的应用程序启动时,它都会带出新数据。我真的不知道为什么会这样,有人可以在这里发现哪里出错了吗?以下是我的 Java 代码:

CardChannel channel = card.getBasicChannel(); byte[] read_memory_card = (byte) 0xFF, (byte) 0xB0, (byte) 0xA7A6A5A4, (byte) 0xA3A2A1A0, (byte) 0x00; ResponseAPDU read_data_resp = channel.transmit(new CommandAPDU(read_memory_card)); if (read_data_resp.getSW1() == 0x90 && read_data_resp.getSW2() == 0x00) System.out.println("Data in Card: " + read_data_resp.getData() + "and SW1: " + read_data_resp.getSW1());

我得到的结果:卡中的数据:[B@378bf509 和 SW1:144

请注意卡中的数据每次都会更改,应用程序会重新启动。

【问题讨论】:

为什么要将0xA7A6A5A4 转换为一个字节?这只会发送给读者0xA40xA3A2A1A0 也是如此。此外,您应该将 sw1 输出为十六进制,但您已经知道 sw1 是 0x90,因为您的 if 语句。 @RobertSnyder,我在他们的手册上看到了完全一样的文字。我从来不知道它可以这么容易地压缩。感谢指正 您是否正在查看第 4.6.2 节?如果是这样,那么你做错了。我不确定如何阅读他们的要求,但他们指的是这些位。因此,您要求提供地址1010 0100,如果我正在阅读文档正确1000 000 具有特殊含义。 我实际上在看第 4.6.2 节,那是适用于我的智能卡类型的那个 Java: Syntax and meaning behind "[B@1ef9157"? Binary/Address?的可能重复 【参考方案1】:

我假设您看到的“不同”数据并不是真正不同,而是您正在打印出 Java 用作默认 toString() 的内存中的指针。我只能假设read_data_resp.getData() 返回一个byte[],在这种情况下,如果您想将每个值可视化,您需要将其转换为字符串。如果你在谷歌上搜索如何将字节数组转换为十六进制字符串,你会找到很多答案。

【讨论】:

我添加了这行代码,但没有显示任何内容:byte[] data_read = read_data_resp.getData(); for (int i = 0; i < data_read.length; i++) System.out.printf("%02X ", data_read[i]); @MrHeart 根据您的信息和文件猜测,您要求从无效或不包含数据的卡中读取地址。

以上是关于使用 ACR38 读卡器从 SLE 4442 智能卡读取数据的主要内容,如果未能解决你的问题,请参考以下文章

与 IC 读卡器和 SLE5528 智能卡配合使用

SLE4428 智能卡的问题

如何读写未知的智能卡?

使用 pkcs#11 从智能卡读取文本文件

用于在 Java 中签署证书的智能卡类型

有人使用 ACR1222L android 库吗?