运营商芯片技术-超级SIM卡

给你一张SIM卡,你可以用作校园卡,也可用作羊城通,技术上你要如何实现?
业界给的答案:超级SIM卡(一张可以通过nfc刷卡的电话卡,简称nfc-sim)

技术上你要如何实现?

在实际场景的应用中,可以简化成简单的三个步骤:

  1. 数据初始化

  2. 数据传输

  3. 数据处理

image

技术上你要如何实现?只需要关注下这三个问题:1. SIM卡数据怎么初始化?2. SIM卡数据怎么传输?3. 一卡通系统怎么处理数据?

一、常见卡片

1、卡片种类

(注意:超级SIM卡是双面卡,同时支持接触式和非接触式来交互数据)

image

2、卡片介绍

  • ID卡:是一种不可写入的感应式卡,有一个固定卡号,卡号在封卡前写入后不可再更改,封卡后只能读卡号。

  • M1卡:含有存储器,数据读写需要秘钥,数据直接读写在存储器上。

  • 普通CPU卡:以复旦微电子的FM1208卡为例,含有cpu,ram和rom,内置一个cos系统,内置多个文件,每个文件读写需要密钥(内外两重验证)。

  • JavaCard:同样含有cpu,ram和rom,内置一个cos系统,在系统上安装JCVM虚拟机,可以部署多个java applet应用;

3、卡片的供电方式

主要分为接触式和非接触式:

  • 接触式:芯片向外暴露有6个触点,插入机器后,手机卡槽的探针接触芯片供电;

  • 非接触式:通过读卡器发出电磁波,切割铜线生电;

工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存。当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。

二、超级SIM卡的物理特性

1、物理特性

缺少总部的超级SIM卡技术文档,目前对超级SIM卡的物理特性了解不多

  1. 卡片实现:默认是JavaCard的CPU卡,在CPU卡区域模拟了一个1K大小的M1卡;

  2. 容量大小:480K左右,能安装15个java applet应用;

  3. 供电方式:手机接触式充电,驱动手机NFC模块以对外交互数据。因此手机没电关机后,剩余的电量还能支撑驱动NFC模块使用(并无评测数据,为总部反馈数据)

  4. 工作频率:13.56MHz

  5. 数据交互:支持手机系统通过本地oma调用,利用sim卡的两个触点传输数据;也支持手机用NFC模块驱动超级SIM卡,在13.56MHz频率下与POS读写器通过电磁波交互数据。

2、物理结构

CPU:处理器单元

RAM:用于存放临时数据

ROM:用于存放系统程序,用户不可修改

EEPROM:用于号码、短信等数据,可擦写的程序等(超级SIM卡的M1模式就是使用这块区域)

image

三、M1卡的技术实现

M1卡是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,目前都有国产芯片与其兼容,属于非接触式IC卡。最为重要的优点是可读可写并且安全性高的多功能卡。这些优点与其自身的结构密不可分。

1、主要指标

  • 分为16 个扇区,每个扇区为4 块,每块16 个字节,以块为存取单位

  • 每个扇区有独立的一组密码及访问控制

  • 每张卡有唯一序列号,为32 位

  • 具有防冲突机制,支持多卡操作

  • 无电源,自带天线,内含加密控制逻辑和通讯逻辑电路

  • 数据保存期为10 年,可改写10 万次,读无限次

  • 工作温度:-20℃~50℃(温度为90%), PET 材料封装得M1 卡,温度可达100℃。

  • 工作频 :13.56MHZ

  • 通信速 :106KBPS

  • 读写距离:10cm 以内(与读写器有关)

2、存储结构

M1 卡分为16 个扇区,每个扇区由4 块 (块0、块1、块2、块3)组成,(我们也将16 个扇区的64 个块按绝对地址编号为0~63,存贮结构如下图所示:

image
  1. 第0扇区的块0 (即绝对地址0 块),它用于存放厂商代码,已经固化,不可更改。

  2. 每个扇区的块0、块1、块2 为数据块,可用存贮数据,可以进行初始化值、加值、减值、读值操作;

  3. 每个扇区的块3 为控制块,包括了密码A、存取控制、密码B。具体结构如下:

image

3、密码机制

M1卡通过密码A、存取控制、密码B三者共同控制数据块的读写权限,极为巧妙。

(1)控制位定义

表:控制位定义"CXxy" (大写X=控制位序号,每块共3个控制位; y=块0,块1,块2)

image

例如:C1x0中的C代码这是控制位,1代表第一位,0代表是块0的控制位。

(2)控制位在存储控制中的存放位置

image

(3)三个控制位的权限控制表

一个扇区的三个数据块,我们可以利用密码机制对它们分别进行权限控制

数据块(块0、块1、块2)的存取控制如下:

image

控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

image

四、JavaCard卡的技术实现

1、什么是JAVA卡?

JAVA卡是一种可以运行JAVA程序的智能卡。该智能卡由CPU、EEPROM(存储)、RAM(内存)、加密协处理等组成,很像一台小型的PC,主要用于安全服务场景。

2、工作模型

JAVA卡上电以后系统就会自动运行,主机通过发送APDU访问JAVA卡的功能。JAVA卡只接受2种APDU:选择应用APDU(系统实现),应用功能APDU(应用实现)。

典型工作流:

  1. JAVA卡上电

  2. 发送APDU选择应用1 –> JAVA卡调度应用1 –> 发送功能APDU -> 应用1响应功能APDU

  3. 发送APDU选择应用2 –> JAVA卡调度应用2 –> 发送功能APDU -> 应用2响应功能APDU

  4. JAVA卡下电

image

JAVA卡虚拟机:解释执行JAVA字节码指令。

JAVA卡标准API:是J2SE的一个子集,详情请参考下面:1. java.lang,定义Object和Throwable等基础类

2. javacard.framework,核心框架类(应用框架、消息传输、瞬时内存、事务处理等)

3. javacard.security,定义安全框架基础类

4. javacardx.crypto,定义了Cipher和KeyEncryption等基础类

5. org.globalplatform,GP规范的应用编程接口

JAVA卡私有API:卡商自定义的API,提供提供附加实用功能。

JAVA卡应用:系统自带的应用或用户编写的应用,系统自带的应用必须有Card Manager(AID=A000000003000000),负责上传应用、安装应用、删除应用、其他管理功能等。

APDU:定义了主机和JAVA卡之间交互的数据格式,JAVA卡由process方法处理APDU。

3、编写、生成JAVA卡应用

1、利用JAVA卡的API编写JAVA应用代码。

2、编译JAVA应用代码为Class字节码(注意必须使用JDK1.5编译,或在eclipse中设置,因为转换工具只支持这个版本)。

3、利用converter.bat(参见java_card_kit-2_2_2使用介绍,JCOP支持自动生成)将Class文件和Export文件(链接信息)转换为CAP应用文件。

说明:因为JAVA卡平台CPU主频比较低,存储和内存都很受限,所以要转换为CAP文件提高资源效率。

image

4、JavaCard应用代码样例

package random;/**

  • Get random number from JavaCard.

*/

import javacard.framework.;import javacard.security.;

public class RandomNumberApplet extends Applet {

private RandomData randomData; public RandomNumberApplet() { randomData = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM); } public static void install(byte[] bArray, short bOffset, byte bLength) { // GP-compliant JavaCard applet registration

new RandomNumberApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]); }

public void process(APDU apdu) { // Good practice: Return 9000 on SELECT

if (selectingApplet()) { return; }

byte[] buf = apdu.getBuffer(); switch (buf[ISO7816.OFFSET_INS]) { case (byte) 0x84: short randomLen = buf[4]; randomData.generateData(buf, (short)0, randomLen); apdu.setOutgoingAndSend((short)0, randomLen); break; default: // good practice: If you don't know the INStruction, say so:

ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } }

}

5、CPU卡通用错误码

  • 6200 “警告 信息未提供”

  • 6281 “警告 回送数据可能”

  • 6282 “警告 文件长度小于Le”

  • 6283 “警告 选中的文件无效”

  • 6284 “警告 FCI格式与P2指定的不符”

  • 6300 “警告 鉴别失败”

  • 63Cx “警告 校验失败(x-允许重试次数)”

  • 6400 “状态标志位没有变”

  • 6581 “内存失败”

  • 6700 “长度错误”

  • 6882 “不支持安全报文”

  • 6981 “命令与文件结构不相容,当前文件非所需文件”

  • 6982 “操作条件(AC)不满足,没有校验PIN”

  • 6983 “您的卡已被锁定”

  • 6984 “随机数无效,引用的数据无效”

  • 6985 “使用条件不满足”

  • 6986 “不满足命令执行条件(不允许的命令,INS有错)”

  • 6987 “MAC丢失”

  • 6988 “MAC不正确”

  • 698D “保留”

  • 6A80 “数据域参数不正确”

  • 6A81 “功能不支持;创建不允许;目录无效;应用锁定”

  • 6A82 “该文件未找到”

  • 6A83 “该记录未找到”

  • 6A84 “文件预留空间不足”

  • 6A86 “P1或P2不正确”

  • 6A88 “引用数据未找到”

  • 6B00 “参数错误”

  • 6Cxx “Le长度错误,实际长度是xx”

  • 6E00 “不支持的类:CLA有错”

  • 6F00 “数据无效”

  • 6F01 “连接中断”

  • 6D00 “不支持的指令代码”

  • 9301 “您的卡余额不足”

  • 9302 “MAC2错误”

  • 9303 “应用被永久锁定”

  • 9401 “您的卡余额不足”

  • 9402 “交易计数器达到最大值”

  • 9403 “密钥索引不支持”

  • 9406 “所需MAC不可用”

  • 6900 “不能处理”

  • 6901 “命令不接受(无效状态)”

  • 61xx “正常 需发GET RESPONSE命令” 读取指令00C00000xx

  • 6600 “接收通讯超时”

  • 6601 “接收字符奇偶错”

  • 6602 “校验和不对”

  • 6603 “警告 当前DF文件无FCI”

  • 6604 “警告 当前DF下无SF或KF”

  • 6E81 “卡片已离开”

五、如何用POS机读写卡数据

1、POS机的选型

M1、CPU卡都是13.56MHz,但是POS机不一定都能读取,这个要看POS机的固件是否支持。一般市面上分2种,后者价格更高。

  • 只能读取M1卡

  • 能读取M1和CPU卡

2、读写M1卡数据

1.手机安装SIM卡并设置好NFC选项为SIM

image

2. 打开电脑客户端,连接读卡器

image
  1. 调用C++ SDK(读卡器厂商负责封装),向读卡器发出读数指令
image
  1. 正确获取指定块的数据
image

六、一卡通系统如何处理数据?

一卡通系统通过POS机获取到返回数据,后台执行处理。

一卡通管理后台一般分为web端和客户端:

  • web端技术栈推荐springboot+vue,开发成本低但是兼容性欠佳;

  • 客户端目前技术潮流推荐JavaFx,可以兼顾性能、开发成本和兼容性三个问题。

image

推荐阅读更多精彩内容