Java Card开发指南(一)

标签(空格分隔): Java 智能卡


以下将要进行的是基于Java Card的智能卡开发学习,第一次我们先来熟悉开发环境。其实卡开发的工作可以看做单片机的开发工作,智能卡已经不是你想象的那样只有记忆和简单运算功能。真正的智能卡,虽然运算能力有限,但其搭载的卡操作系统,可以实现一些嵌入式开发的功能,如计算器啦等等。为了理解方便,你可以把卡当做一个具有运算功能的主机,读卡器这一端相当于I/O设备,对主机进行操作(通过ADPU通信实现)。下面先进行的是卡开发环境的搭建:

安装JDK

这一步不再详述,具体请参照Java开发的相关参考资料。需要注意的是,同Java环境配置过程一样,千万不要忘记配置环境变量Path以及CLASSPATH,这里将JDK和JCDK的环境变量写在了一起,各位请根据自己的需要进行修改:

#JDK和JCDK的Path
C:\Program Files\Java\jdk1.8.0_121\bin;
C:\Program Files\Java\jdk1.8.0_121\jre\bin;
D:\Program Files (x86)\eclipse\java_card_kit-2_2_2-windows\java_card_kit-2_2_2\java_card_kit-2_2_2-rr-bin-windows-do\bin;
#JDK和JCDK的ClASSPATH
C:\Program Files\Java\jdk1.8.0_121\lib\dt.jar;
C:\Program Files\Java\jdk1.8.0_121\lib\tools.jar;
D:\Program Files (x86)\eclipse\java_card_kit-2_2_2-windows\java_card_kit-2_2_2\java_card_kit-2_2_2-rr-bin-windows-do\lib\api.jar

下载JCDK

这就是卡开发环境了,这里给出的JCDK版本为JDCK2.2.2
设置环境变量的工作在上一节已经讲述完毕,这里不再赘述。

安装Eclipse

这一步也和Java开发类似,并没有什么技术含量,将其下载至本地解压即可。安装后启动一次设置好工作目录workspace,以便于接下来的工作开展。

安装JCOP

这个插件是为了在Eclipse中调试卡使用,据说现在收费了。给一个JCOP的外链JCOP Eclipse javacard 插件
下载完成后,将其解压到对应的Eclipse下目录/plugins,同时将文件名为com.ibm.bluez.jcop.eclipse.prefs拷贝至Eclipse工作目录workspace下的.metadata.plugins\org.eclipse.core.runtime.settings目录

安装JCDE插件

这个插件的作用是为了方便在IDE中进行调试,同样将其解压到对应Eclipse下目录/Plugins,然后启动Eclipse,这时菜单栏多出三个菜单选项CREF、Java Card、JCWDE。点击JavaCard->Preferences,将JavaCardHome设置为JCDK所在目录如:

D:\Program Files (x86)\eclipse\java_card_kit-2_2_2-windows\java_card_kit-2_2_2\java_card_kit-2_2_2-rr-bin-windows-do\bin;

运行第一个demo

新建一个Java Card Project,这里命名为hellojavacard,然后新建一个Java Card Applet,这里命名为Appletcard。Applet代码如下:

package hellojavacard;

import javacard.framework.APDU;
import javacard.framework.ISO7816;
import javacard.framework.Applet;
import javacard.framework.ISOException;

public class Appletcard extends Applet {

    private Appletcard() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException {
        new Appletcard().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu) {
        if (selectingApplet()) {
            return;
        }

        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0x00:
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

}

回到界面左侧,点击hellojavacard所在的包,然后点击菜单栏Java Card->Convert,这时候会生成卡平台的一个重要文件以*.cap为后缀,同时还有其他文件用途如下所示。对于Java Card这个菜单选项,各个按钮的作用如下:

“Set Package AID”:设定选中包的AID,这个AID将会在生成CAP文件和APDU脚本、以及将该包安装到模拟器中时用到。
“Set Applet AID”:设定选中的Java Card Applet的AID
“Convert”:将Java Card package转换为CAP文件;可以选择是否同时生成EXP文件和JCA文件。
CAP文件:转化后的applet文件,可被JAVA卡装载并安装的可执行代码
EXP文件:输出文件,包含JAVA卡包的公共信息和连接信息
JCA文件:可读汇编语言,由转换器生成,可进一步生成CAP文件
“Generate Script”:生成APDU脚本文件*.script
“Run Script”:发送APDU脚本文件中的APDU命令到模拟器中
“Deploy”:部署嘛,当然是把CAP写到卡上啦(这里的卡是JCWDE模拟的)
“Instantiate Applet”:和上面差不多?实例化Applet,应当是包括了激活工作

这些按钮其实是和JCDK中几个工具Converter、ADPUTool、ScriptGen一一对应的。我们点击JCWDE->Start,模拟一张卡片。然后再进行上面几个操作就可以啦。这里以运行脚本cap-download.script为例。点击IDE右下角的console图标切换console,就可以看到以下输出内容:

Java Card 2.2.2 APDU Tool, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.
Opening connection to localhost on port 9025.
Connected.
Received ATR = 0x3b 0xf0 0x11 0x00 0xff 0x00 
CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 09, a0, 00, 00, 00, 62, 03, 01, 08, 01, Le: 00, SW1: 90, SW2: 00
CLA: 80, INS: b0, P1: 00, P2: 00, Lc: 00, Le: 00, SW1: 90, SW2: 00
CLA: 80, INS: b2, P1: 01, P2: 00, Lc: 00, Le: 00, SW1: 90, SW2: 00
CLA: 80, INS: b4, P1: 01, P2: 00, Lc: 17, 01, 00, 14, de, ca, ff, ed, 01, 02, 04, 00, 01, 0a, 01, 02, 03, 04, 05, 06, 07, 08, 09, 00, Le: 00, SW1: 64, SW2: 3a
CLA: 80, INS: bc, P1: 01, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 02, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 02, P2: 00, Lc: 20, 02, 00, 1f, 00, 14, 00, 1f, 00, 0f, 00, 15, 00, 1e, 00, 0c, 00, 3f, 00, 0a, 00, 0b, 00, 00, 00, 4d, 00, 00, 00, 00, 00, 00, 02, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 02, P2: 00, Lc: 02, 01, 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 02, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 04, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 04, P2: 00, Lc: 18, 04, 00, 15, 02, 03, 01, 07, a0, 00, 00, 00, 62, 01, 01, 00, 01, 07, a0, 00, 00, 00, 62, 00, 01, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 04, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 03, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 03, P2: 00, Lc: 12, 03, 00, 0f, 01, 0b, 01, 02, 03, 04, 05, 06, 07, 08, 09, 00, 00, 00, 08, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 03, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 06, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 06, P2: 00, Lc: 0f, 06, 00, 0c, 00, 80, 03, 00, ff, 00, 07, 01, 00, 00, 00, 1c, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 06, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 07, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 07, P2: 00, Lc: 20, 07, 00, 3f, 00, 01, 10, 18, 8c, 00, 00, 7a, 05, 30, 8f, 00, 01, 3d, 8c, 00, 02, 18, 1d, 04, 41, 18, 1d, 25, 8b, 00, 03, 7a, 02, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 07, P2: 00, Lc: 20, 21, 18, 8b, 00, 04, 60, 03, 7a, 19, 8b, 00, 05, 2d, 1a, 04, 25, 73, 00, 0b, 00, 00, 00, 00, 00, 09, 70, 08, 11, 6d, 00, 8d, 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 07, P2: 00, Lc: 02, 06, 7a, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 07, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 08, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 08, P2: 00, Lc: 0d, 08, 00, 0a, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 08, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 05, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 05, P2: 00, Lc: 20, 05, 00, 1e, 00, 07, 06, 80, 03, 00, 01, 00, 00, 00, 06, 00, 00, 01, 03, 80, 03, 02, 03, 80, 03, 03, 03, 80, 0a, 01, 06, 80, 07, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 05, P2: 00, Lc: 01, 01, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 05, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b2, P1: 09, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: b4, P1: 09, P2: 00, Lc: 0e, 09, 00, 0b, 00, 00, 00, 07, 05, 06, 04, 0a, 07, 07, 15, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: bc, P1: 09, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21
CLA: 80, INS: ba, P1: 00, P2: 00, Lc: 00, Le: 00, SW1: 64, SW2: 21

你可能感兴趣的:(Java Card开发指南(一))