有没有人有使用JAVA阅读eVRC(电子车辆登记卡)和APD U命令的经验?
任何例子都会有用。
提前致谢。
答案 0 :(得分:4)
我强烈建议您使用javax.smartcardio库。请注意,存在一些可用性问题,例如64位和后续Java运行时环境中32位的访问条件。也就是说,与处理APDU的许多其他API相比,APDU和CardTerminal接口非常简洁。
[UPDATE]关于命令,这似乎是一个简单的file based card,它不执行任何加密,并在指定的DF中使用专有文件结构。所以基本操作是:通过AID检索ATR,SELECT,现在你在DF(应用程序的根目录)中。然后使用SELECT by File ID选择每个文件,然后选择X个READ BINARY命令。
E.g。
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结构并验证当然的签名,但我认为这超出了范围。
答案 1 :(得分:0)
您可能会喜欢https://github.com/grakic/jevrc
JEvrc是一个可重复使用的开源Java库,用于从塞尔维亚/欧盟eVRC卡读取公共数据。它包括一个简化的TLV解析器,用于解析卡数据。它支持塞尔维亚eVRC卡的配置文件,但应该可以通过一两个补丁进行推广。