java apdu读取社保卡_使用javax.smartcardio的用于智能卡的ISO 7816 APDU

本文档描述了在使用Java的javax.smartcardio库读取社保卡时遇到的问题,包括APDU命令中数据字段转换为错误字节以及响应错误代码6A 80。作者尝试创建MF(主文件)时,发现十六进制值被转换为负数,导致APDU命令无效。问题可能源于数据字段的字节转换方法。尽管作者已经能够使用智能卡工具成功创建MF,但在Java中实现相同操作遇到了困难。
摘要由CSDN通过智能技术生成

我已经使用 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的东西不是很专业) .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值