2

有没有人在 JAVA 中阅读 eVRC(电子汽车电子登记卡)和 APD U 命令的经验?

任何示例都会很有用。

提前致谢。

4

2 回答 2

4

我强烈建议您使用 javax.smartcardio 库。注意在后面的 Java 运行环境中存在一些可用性问题,例如 64 位和 32 位的访问条件。也就是说,与许多其他处理 APDU 的 API 相比,APDU 和 CardTerminal 接口非常简洁。

[更新]关于命令,这似乎是一个简单的基于文件的卡,不执行任何加密,并在指定的 DF 内采用专有文件结构。所以基本操作是:retrieve ATR,SELECT by AID,现在你在DF(应用程序的根目录)。然后使用 SELECT by File ID 选择每个文件,然后是 X 个 READ BINARY 命令。

例如

send "00A4040C 0X <AID>" // SELECT DF aid was not given in document, so find this out, probably JRC
send "00A40200 02 D001 00" // SELECT EF.Registration_A (and hopefully parse the response to get the file length)

send "00B00000 00" // READ BINARY return up to 256 bytes or
send "00B00005 XX" // READ BINARY return xx bytes, the number of bytes left, from offset 05

那将是在 Java 中(在我的脑海中):

CommandAPDU command = new CommandAPDU(0x00, 0xA4, 0x02, 0x00, new byte[] { (byte) 0xD0, (byte) 0x01 }, 256);
ResponseAPDU response = channel.send(command);

请注意,您可能需要解析 READ BINARY 的前几个字节以以兼容的方式找出文件长度。确保您没有读取仍然剩余的实际字节数,因为您基本上可能会遇到任何错误。循环时,只计算实际返回的字节数,而不是请求的(最大)数。

如果您使用智能卡 IO 库,您只需指定前 4 个字节作为标头,然后是数据(将为您计算命令数据的长度),然后是 Ne,您希望返回的最大字节数(如果适用)。

当然,主要的痛苦是解析底层 BER 结构并验证签名,但我认为这超出了范围。

于 2012-03-01T22:15:02.053 回答
0

你可能会喜欢https://github.com/grakic/jevrc

JEvrc 是一个可重用的开源 Java 库,用于从塞尔维亚/欧盟 eVRC 卡中读取公共数据。它包括一个简化的 TLV 解析器,用于解析卡片数据。它支持塞尔维亚 eVRC 卡配置文件,但应该可以通过一两个补丁进行概括。

于 2013-11-13T01:37:59.347 回答