当前位置: 首页 > 知识库问答 >
问题:

Java卡-小程序选择失败

乐正育
2023-03-14

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

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/get块中的初始化代码,选择小程序是没有问题的。

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

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

请指导我哪里出了问题,因为我是新来的Java卡编程

谢谢

共有2个答案

金飞翼
2023-03-14

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

景仲渊
2023-03-14

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

0x00 0xA4 0x04 0x00 0X07 0XFC 0X74 0X41 0XA1 0X9B 0X63 0x7F
 类似资料:
  • 问题内容: 我正在编写一个Java程序,并且在程序的某些部分中使用了JTextpane。在此JTextpane中,我使用制表符(\ t)来创建列,例如: 我可以在标签(\ t)距离处看到列中的值。制表符距离始终相同,我想更改此距离以改善外观。 您知道如何更改JTextPane中的制表符(\ t)大小吗? 提前致谢。 问题答案:

  • 我在让我的排序检查每个索引时遇到问题。它跳过了的第三个索引,因为它去了,,到,我不知道它为什么这样做?。此外,我的数字实际上被交换时遇到了问题。有人知道我的错误在哪里吗?

  • 预期:[硬币[价值=1.0,名称=美元],硬币[价值=0.25,名称=四分之一],硬币[价值=0.1,名称=一角硬币],硬币[价值=0.05,名称=镍],硬币[价值=0.01,名称=便士]]

  • 虽然NatTable已经有一个类RowSelectionProvider,但是我的数据是通过单元格而不是行提供的,所以我不能使用这个类。是否可能创建一个类CellSelectionProvider,或者它会太难? 我要做的是在NatTable中选择一个单元格,它链接到一个eObject。然后在编辑器中选择EObject,并在properties视图中显示其属性。第一部分我能做,但第二部分不行。 我

  •   特征选择试图识别相关的特征用于模型构建。它改变特征空间的大小,它可以提高速度以及统计学习行为。ChiSqSelector实现卡方特征选择,它操作于带有类别特征的标注数据。 ChiSqSelector根据独立的卡方测试对特征进行排序,然后选择排序最高的特征。下面是一个使用的例子。 import org.apache.spark.SparkContext._ import org.apache.s

  • 本文向大家介绍微信小程序仿美团城市选择,包括了微信小程序仿美团城市选择的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了微信小程序城市选择器,供大家参考,具体内容如下 代码很简单. demo下载地址 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。