我已经习惯javax.smartcardio
了从智能卡中读取序列号而不费力气。但是现在我被分配在空白卡上创建 MF(没有它无法读取序列号)。我正在根据 ISO 7816 指南为此创建 APDU 命令,但无法创建正确的 APDU 命令,因为我的十六进制值是转换为错误的字节。
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;
class SmartCardAPIs {
public int Create_MF() throws CardException{
//--Variable declaration
int result=0;
Card card=null;
byte[] responseData=null;
ResponseAPDU answer=null;
String SW1=null;
String SW2=null;
int cla, ins, p1, p2;
byte[] data=null;
//---------------------------------------------
//--1--Establish connection with the smart card
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
// Use the first terminal
CardTerminal terminal = terminals.get(0);
// Connect with the card
card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
//---------------------------------------------
//--2--Create MF
cla=0x00;
ins=0xE0;
p1=0x00;
p2=0x00;
data = new byte[] {
(byte) 0x21,
(byte) 0x62,
(byte) 0x1F,
(byte) 0x82, // **** Getting converted to -126 ****
--
--
--
};
answer = channel.transmit(new CommandAPDU(cla, ins, p1, p2, data));
responseData= answer.getBytes();
if(responseData!=null)
{
if(responseData.length==2)
{
SW1=String.format("%02X ", (responseData[0])).trim();
SW2=String.format("%02X ", (responseData[1])).trim();
}
}
}
}
我有2个问题
1:命令 APDU 中的数据占用了一个错误的字节(标记为*)。
2:SW1 和 SW2 返回为 6A 80,这意味着数据字段中的参数不正确(我猜是因为将十六进制格式的 int 转换为字节时为负值,但由于我被迫这样做,所以无济于事)。
我在这里放置的部分 APDU 命令是我提供的完整命令的一部分,并且该命令是 100% OK 并且经过测试,因为我已经成功地使用带有命令的智能卡工具在空白卡中创建 MF .我现在想在java中做同样的事情。
我认为问题出在创建此 APDU 的方式上,可能是负值问题(尽管我创建了 Applet 以从卡中读取序列号,但我对 java APDU 的东西不是很熟悉)。