Java me 在卡和终端之间生成安全通道
我想在卡和终端之间生成安全通道。这是我的代码:Java me 在卡和终端之间生成安全通道,java-me,smartcard,javacard,Java Me,Smartcard,Javacard,我想在卡和终端之间生成安全通道。这是我的代码: final static byte INIT_UPDATE = (byte) 0x50; final static byte EXT_AUTHENTICATE = (byte) 0x82; SecureChannel sc; public void process(APDU apdu) throws ISOException { if (selectingApplet()) {
final static byte INIT_UPDATE = (byte) 0x50;
final static byte EXT_AUTHENTICATE = (byte) 0x82;
SecureChannel sc;
public void process(APDU apdu) throws ISOException {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
short inlength = 0;
try
{
switch (buffer[ISO7816.OFFSET_INS]) {
case INIT_UPDATE:
case EXT_AUTHENTICATE:
makeSecureChannel(apdu);
break;
}
catch (CryptoException e)
{
short r = e.getReason();
ISOException.throwIt(r);
}
}
当我发送命令时80 50 20 00 08 01 15 6A 2A F5 64 87 CF
我得到错误6a88
,当我发送命令时00 50 20 00 08 01 15 6A 2A F5 64 87 CF
我得到错误6e00
。
每个人都能帮我吗?Statusword
6E00
不是很有趣。这意味着您发送的CLA(类)字节不正确。这是因为初始化更新在ISO7816中没有定义,所以它是一个专有命令。专有命令必须设置其专有位。因此,类字节80
是唯一正确的
另外,让我们关注INIT UPDATE的响应:
6A88
<代码>6A88表示“未找到参考数据”。这可能意味着P1和P2引用的键不匹配。将P1和P2都置于00
以确保自动选择密钥(如果要明确选择P1中的密钥版本,请检查响应数据中的“密钥信息”)能否将错误定位到特定的代码行?你能调试吗?您确定您的卡支持此全局平台API调用吗?在发送APDU命令之前,您是否选择了小程序?您的卡上是否设置了密钥版本==0x20的密钥?如果否,则将0x20替换为0x00。
private void makeSecureChannel(APDU apdu)
{
byte[] buf = apdu.getBuffer();
byte cla = buf[ISO7816.OFFSET_CLA];
byte ins = buf[ISO7816.OFFSET_INS];
try
{
apdu.setIncomingAndReceive();
if(ins == INIT_UPDATE)
{
sc = GPSystem.getSecureChannel();
}
short len = sc.processSecurity(apdu);
apdu.setOutgoing();
apdu.setOutgoingLength(len);
apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len);
}
catch(APDUException ex1)
{
ISOException.throwIt(ex1.getReason());
}
}