java - 发送 APDU 命令到 android 中的 USIM/SIM 卡

标签 java android smartcard javacard sim-card

我已经使用过智能卡并且熟悉 APDU 命令(在 ISO/IEC 7816Global Platform 规范中定义)。

现在我想知道有没有什么办法可以发送APDU指令到我手机上的USIM/SIM卡? (三星 A3 安装了 Android v4.4.4 kitkat。)

我已经在 Google 中搜索过,我找到了一些相关的主题和工具,名为 SIM Toolkit ApplicationSeek for Android。但是我真的不明白这些是什么?这些项目是我必须在手机上安装的两个应用程序吗?还是USIM/SIM卡上已经安装了这两个工具,可以接收手机指令?

主动命令APDU命令AT命令有什么区别?

我应该学习android来开发SIM卡应用还是只需要Java Card规范和ETSI标准?

提前致谢。

最佳答案

您的 SIM 卡上可能存在两种不同类型的小程序。

常用小程序

用纯 JavaCard 编写的常见小程序。这是您在普通智能卡世界中习惯使用的小程序类型。它有 process 方法,智能卡是通信中的被动主体:您的应用程序发送 APDU 命令和卡响应。

您可以使用一组称为 SEEK for Android 的特殊 Android 库与这些小程序通信。看看这个tutorial了解如何创建这样的电话应用程序。

从 API 级别 21 开始,还有一种使用 Telephony Manager 与 SIM 卡通信的方法.但是,存在一个巨大障碍:您的应用需要MODIFY_PHONE_STATE 权限,该权限只能授予系统应用。不允许常规的非系统应用程序使用它。

SIM 工具包小程序

SIM 卡不仅仅是普通的智能卡,如果您想使用 SIM 卡提供的所有可能性,为 SIM 卡编写小程序可能比普通智能卡复杂得多。我推荐你阅读 this paper - 这是某人的学士论文,但它是我在整个 Internet 上找到的适合初学者的最佳概述。我也推荐this video from the DefConn conference .

加载到SIM卡上的小程序的作用不同了:小程序不再是一个被动的实体。电话会定期询问您的小程序:“我能为您做些什么吗?”你的小程序可以回复:“是的,请发送这条短信”或“告诉我现在几点了”等。此外,你的小程序可以成为一些事件的监听器:来电、收到的短信、时间间隔已过等。是的,从技术角度看,SIM卡似乎是被动的,但它的作用实际上是主动的:是SIM卡向手机发送命令。

这些命令称为“主动命令”或 SIM 应用程序工具包命令。结构相同——CLA INS P1 P2 LC数据LE;意义不同。

您可以使用名为 sim.toolkit 的特殊 JavaCard 包中的类从您的小程序发送它们。

(SIM Application Toolkit 是一种标准,它指定主动命令的方式与 Global Platform 指定小程序生命周期的方式相同。)

SIM 工具包小程序示例:

import sim.toolkit.ToolkitInterface;
import sim.toolkit.ToolkitRegistry;
...
import javacard.framework.ISOException;

public class STKTest extends Applet implements ToolkitInterface {

public static void install(byte[] bArray, short bOffset, byte bLength) {
    // GP-compliant JavaCard applet registration
    new STKTest().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
//this method handles standard APDU commands
public void process(APDU apdu) {
    // Good practice: Return 9000 on SELECT
    if (selectingApplet()) {
        return;
    }

    apdu.setIncomingAndReceive();
    final byte[] buf = apdu.getBuffer();
    switch (buf[ISO7816.OFFSET_INS]) {
    case (byte) 0x00:
        //do something
        break;
    }
}
//this method handles the SIM Toolkit commands
public void processToolkit(byte event) throws ToolkitException {
    switch (event) {

    case ToolkitConstants.EVENT_TIMER_EXPIRATION:
        //do something
        break;
    }
}

}

是的,您应该学习 Android - 您将需要它来使用 SEEK 库。你的问题很宽泛,如果你愿意,请问我任何细节。

关于java - 发送 APDU 命令到 android 中的 USIM/SIM 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30325663/

相关文章:

java - 在 Java Card 递归编程期间捕获内存异常

java - 从 Java 打印失败并显示 'pstopdffilter/pstocupsraster failed with err number -31000'

java - JodaTime 夏令时错误

android - 从 AsyncTask 调用 AlertBuilder 时出现异常

smartcard - 如何发送包含除 0x9000 之外的返回数据和状态字的响应 APDU?

smartcard - Secure Com SCP02 session : What is the role of "Key Diversification data" returned in response of Initialized Update command

java - 在Android中处理ALPHA_8位图并显示在ImageView中

java - JsonArrayBuilder 给出空白输出

java - ISO 8601 字符串到 Android 中的日期/时间对象

java - TextView 不会在 ListView 适配器中设置 Text()