读写可编程 SIM/USIM 卡
2019-11-25 11:23 云物互联 阅读(6802) 评论(0) 编辑 收藏 举报目录
SIM 卡
SIM 卡,用户身份模块(Subscriber Identity Module,SIM),是主要用于存储用户身份识别数据、短信数据和电话号码的智能卡。
SIM 卡主要用于 GSM(2G)网络和 TD-SCDMA(3G)网络,但是兼容的模块也可以用于 IDEN 电话。有人把 CDMA2000 和 CDMAOne 的 RUIM 卡和 UIM 卡,也称作 SIM 卡,虽然两者作用类似,并遵守了一样的所有机械、电气标准和部分软件标准,但是上层应用并不一定兼容。
SIM 由 CPU、ROM、RAM、EEPROM 和 I/O 电路组成。用户使用 SIM 卡时,实际上是手机向 SIM 卡发出命令,SIM 卡应该根据标准规范来执行或者拒绝。
值得注意的是,SIM 卡并不是单纯的信息存储器,也具有运算功能,拥有 ADM key 的 SIM 卡甚至可以运行 Java 程序。当前的 SIM 卡允许在用户使用时加载程序运行。这些程序通过 SIM 工具箱与手机或者服务器进行交互通讯,SIM 工具箱程序使用私有 API 编写,为了保证程序的交互使用性,ETSI 提出了 Java Card 的解决方案。SIM 卡规格现由 3GPP 和 ETSI 维护。
由于 SIM 卡只支持单向鉴权,不支持双向鉴权。即网络对手机(SIM)进行合法性的认证,缺乏用户对网络的认证,这就给诸如 “伪基站” 这样的不法行为留了空子,其后果为犯罪分子任意冒用他人手机号码或任意号码强行向用户手机发送诈骗、推销等垃圾短信。将手机卡升级为 USIM卡 就可以解决这一漏洞。
USIM 卡
USIM 卡,UMTS 用户身份模块(UMTS Subscriber Identity Module),是用于 UMTS 网络中的用户身份识别模块。USIM 卡还可以储存使用者资料、电话号码、认证资料、密钥、加密算法以及为短信提供储存空间。USIM 卡通常被认为是 SIM 卡的升级版,在 LTE(4G)网络中必须使用 USIM 卡,同时 USIM 卡兼容 2G、3G 网络。
当用户需在外国使用漫游服务时,可以把原用的 USIM 卡插入对应该地的无线制式设备,即兼容此 USIM 卡的手机来使用漫游服务。为提供认证服务,USIM 卡储存一组长期的加密钥匙(Ki),与网络的认证中心(AUC)共用。USIM 卡亦认证一串连续数字,这些数字不可超过一个范围,以避免被重放攻击。
由于 USIM 卡支持双向鉴权,允许手机(USIM)对网络进行合法性认证,这种做法有效地解决了 SIM 卡只支持单向鉴权,不支持双向鉴权的安全漏洞,有效的解决了伪基站、信息泄露和垃圾短信的骚扰。
USIM 卡的关键参数
ICCID(Integrated Circuit Card Identification,智能卡识别序列号码):用以标识 USIM 卡。格式为:898600 M F SS YY G XXXXXXX
,含义如下:
- 898600:固定不变。
- M:代表移动业务接入号的末位,分别为 9、8、7、6、5。
- SS:代表各省编号。
- YY:代表编制 ICCID 时的年号(取年份的后两位)。
- G:代表 SIM 卡供应商的编号。
IMSI(International Mobile Subscriber Identity,国际用户识别码):全球唯一的用户识别码,在于移动通信网络系统交互时作为用户身份识别的依据。
Ki:鉴权密钥,用于用户身份的鉴权。
OP:鉴权密钥,用于用户身份的鉴权,每个省公司使用唯一的 OP。
OPc:鉴权密钥,使用 OP 和 Ki 分散计算得出。
NOTE:IMSI、Ki、OP/OPc 都是唯一的,在 LTE/EPC 中会被记录在 HSS 中央数据库。IMSI 和 Ki 值都存在初始的 USIM 卡中,而只会在 USIM 卡中存储 OP 或 OPC 两者之一。对 USIM 卡进行读写,主要是对这三个数值进行读写。
C1-C5:为 TDS-CDMA 的鉴权常量。
R1-R5:为 TDS-CDMA 鉴权旋转常量。
NOTE:以上两种参数每个省使用唯一的值,存储于初始的 USIM 卡中。
SQN(Sequence Number):是 TDS-CDMA 网络下发的鉴权参数,鉴权完毕后,SQN 值将被存放于 USIM 卡中,初始卡中 SQN 值为 0。
L 和 Delta:是用于校验 SQN 合法性的参数,L 和 Delta 存储于 USIM 卡中,并且每个省份使用唯一的值。
pySim 读写软件与 ADM key
pySim 可用于对 USIM 卡进行读写,支持串口与 PC/SC 两种读卡器。e.g.
- -d:Serial Device fo SIM Access [default: /dev/ttyUSB0]
- -p:Which PS/SC number for SIM access
注意,上述 PS/SC number 是执行 pcsc_scan
指令后得到的,如下述输出中的 0:
Scanning present readers...
0: Identiv SCR35xx USB Smart Card Reader [CCID Interface] (xxxxxxxxxxxxxx) 00 00
pySim 支持 sysmoUSIM-GR1、sysmoUSIM-SJS1等 USIM 卡,写 USIM 卡最主要的是对 ADM key 进行鉴权以及关键参数(Ki、IMSI、OP/OPc)的写入,写卡命令大部分情况下都是符合智能卡标准的,通过 pySim 写 USIM 卡则需要解决两个问题:
- ADM key 获取及 ADM key 鉴权。
- 某些非标准参数(通常是 Ki)的读写(NOTE:此处的 “非标准” 指文件位置或者写卡命令非标准,然而在 APDU 层面都是标准的)。
pySim 的具体操作方法奇怪浏览官方 Wiki:https://osmocom.org/projects/pysim/wiki