我已经使用 javax.smartcardio 从智能卡读取序列号而不需要太多努力 . 但是现在我被读取了 . 我正在根据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 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();
}
}
}
}
我有两个问题
1:命令中的数据APDU采用错误的字节(标记为 ***** ) .
2:SW1和SW2返回为6A 80,这意味着数据字段中的参数不正确(我猜是因为在以十六进制格式将int转换为字节时为负值,但由于我不得不这么做而无法帮助) .
我在这里放置的部分APDU命令是我提供的完整命令的一部分,命令是100%正常并经过测试,因为我已成功使用智能卡工具使用命令在空白卡中创建MF我现在想在java中做同样的事情 .
我认为问题在于这个APDU被创建的方式,可能是负值问题(虽然我已经创建了Applet来从卡读取序列号,但我对java APDU的东西不是很专业) .