gpt4 book ai didi

java - 使用 javax.smartcardio 的智能卡 ISO 7816 APDU

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:32 24 4
gpt4 key购买 nike

我已经使用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();
}
}
}
}

我有两个问题

1:命令 APDU 中的数据占用了错误的字节(标记为*)。

2:SW1和SW2返回为6A 80,这意味着数据字段中的参数不正确(我猜是因为将十六进制格式的int转换为字节时为负值,但无济于事,因为我被迫这样做)。

我放在这里的部分 APDU 命令是我提供的完整命令的一部分,并且该命令 100% 正常并经过测试,因为我已成功使用该命令使用智能卡工具在空白卡中创建 MF。我现在想在 java 中执行相同的操作。

我认为问题在于创建此 APDU 的方式,可能是负值问题(尽管我已经创建了 Applet 来从卡中读取序列号,但我对 java APDU 不是很专家)。

最佳答案

既然你说,你手头有一个工作命令,并且肯定仔细检查了它的 java 表示:你有多确定该命令在之前的尝试中没有成功执行? (显然只允许一个 MF。)问题是,报告的错误代码与“已知正确的 APDU”假设相矛盾,这是我能想到的唯一解决方案。就给出的情况而言,java 代码看起来是正确的。

其他想法:ISO 创建文件的命令数据字段应该以类似于 FCI 的 0x6X 之类的内容开头。可能你的 0x21 是整个模板的长度(应该作为 LC 发送),java 根据字节数组的长度构造自身,所以尝试将其省略。事实上,第三个字节是 0x1F,意味着 0x21 减去标签和长度,支持了这一假设。

关于java - 使用 javax.smartcardio 的智能卡 ISO 7816 APDU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com