【问题标题】:Java Card - Applet selection failedJava 卡 - 小程序选择失败
【发布时间】:2014-08-30 10:23:00
【问题描述】:

下面是DES加密代码。我收到错误 0x6999:“Applet 选择失败”。

package JCardDES;

import javacard.framework.*;
import javacard.security.*;
import javacardx.crypto.*;

public class JCard_DES extends Applet
{
     // globals
     DESKey deskey;
     Cipher cipherCBC;
     final short dataOffset = (short) ISO7816.OFFSET_CDATA;
     static byte[] TrippleDESKey = {(byte) 0x38, (byte) 0x12, (byte) 0xA4,
          (byte) 0x19, (byte) 0xC6, (byte) 0x3B, (byte) 0xE7, (byte) 0x71, (byte) 0x00, (byte) 0x12, (byte) 0x00,
          (byte) 0x19, (byte) 0x80, (byte) 0x3B, (byte) 0xE7, (byte) 0x71, (byte) 0x01, (byte) 0x12, (byte) 0x01,
          (byte) 0x01, (byte) 0x01, (byte) 0x03, (byte) 0xE7, (byte) 0x71};

     // constructor,
     // initialization
     private JCard_DES(byte bArray[], short bOffset, byte bLength)
     {
          try {
             deskey = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_3KEY, false);
             cipherCBC = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
          }
          catch (CryptoException e) {
             ISOException.throwIt((short) ((short) 0x9000 + e.getReason()));
          }

          if (bArray[bOffset] == 0) 
          {
               register();
          }
          else 
          {
               register(bArray, (short)(bOffset+1), bArray[bOffset]);
          }
     }

     // install
     public static void install(byte bArray[], short bOffset, byte bLength)
     {
          new JCard_DES(bArray, bOffset, bLength);
     }

     public void process(APDU apdu)
     {
          byte[] buf = apdu.getBuffer();

          if (selectingApplet())
          {
               return;
          }

          doTrippeDES(apdu);
     }

     // DES encryption
     private void doTrippeDES(APDU apdu)
     {
          byte a[] = apdu.getBuffer();

          short incomingLength = (short) (apdu.setIncomingAndReceive());
          if (incomingLength != 24) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);

          deskey.setKey(TrippleDESKey, (short)0);
          cipherCBC.init(deskey, Cipher.MODE_ENCRYPT,new byte[]{0,0,0,0,0,0,0,0},(short)0,(short)8);
          cipherCBC.doFinal(a, (short) dataOffset, incomingLength, a, (short) (dataOffset + 24));
          cipherCBC.init(deskey, Cipher.MODE_DECRYPT,new byte[]{0,0,0,0,0,0,0,0},(short)0,(short)8);
          cipherCBC.doFinal(a, (short) (dataOffset + 24), incomingLength, a, (short) (dataOffset + 48));

          // send results
          apdu.setOutgoing();
          apdu.setOutgoingLength((short) 72);
          apdu.sendBytesLong(a, (short) dataOffset, (short) 72);
     }
}

这很奇怪,因为没有try/catch块中的初始化代码,选择小程序是没有问题的。

我的脚本文件(APDU脚本)是

powerup;
// Select JCard_DES
0x00 0xA4 0x04 0x00 0X06 0XFC 0X74 0X41 0XA1 0X9B 0X63 0x7F;

由于我是 Java Card 编程新手,请指导我哪里出错了

谢谢

【问题讨论】:

    标签: applet smartcard javacard


    【解决方案1】:

    您的命令长度 (Lc) 不正确。它应该是0x07 而不是0x06

    0x00 0xA4 0x04 0x00 0X07 0XFC 0X74 0X41 0XA1 0X9B 0X63 0x7F
    

    【讨论】:

    • 如果你的数据(AID)是0XFC 0X74 0X41 0XA1 0X9B 0X63 0x7F,那么你的Lc/P3应该是0x07(7字节)。
    • 我的数据是 0XFC 0X74 0X41 0XA1 0X9B 0X63。 CLA = 0x00 INS = 0xA4 P1 = 0x04 P2 = 0x00 LC = 0X06 数据 = 0XFC 0X74 0X41 0XA1 0X9B 0X63 LE = 0x7F
    • Lc 为命令数据长度,Le 为预期数据长度。您只能在单个 APDU 中发送 Lc 或 Le。如果您的数据/AID 是 0XFC 0X74 0X41 0XA1 0X9B 0X63,则从 APDU 中删除最后一个字节 0x7F。成功响应后,您可以发送带有 Le 的 GET RESPONSE 命令(通常 Le 等于 SW2 或范围从 1 到 SW2)。
    • 这是我从 APDU 中删除 0x7F 后的结果: Invoking apdutool on D:\IT\RISET\JAVA\NetBeansProjects\JCard_DES/scripts/jcard_des.scr ... Input data length != Lc 5号线附近。
    • 您绝对可以拥有带有 Lc 和 Le 的 APDU。 Le=7F 很奇怪,我从来没有见过这个。只需为 Le 输入 0x00,这意味着:归还你拥有的任何东西
    【解决方案2】:

    错误码0x6999表示小程序选择失败。判断你的辅助的正确性和唯一性。注意里面的规则有时候选择辅助完成的时候会自动出现这个概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多