概述:CPU卡包含一个微处理器,其功能相当于一台微型计算机。CPU卡内集成电路中包括中央处理器(CPU)、只读存储器(ROM)、随机存储器(RAM)、电可擦除可编程只读存储器(EEPROM)等。
使用FMCOS,由传输管理、文件管理、安全体系、命令解释四个功能模块组成。
传输管理:监督卡与终端之间的通信,保证数据正确地传输。
文件管理:区别于其他卡按区块存储数据的方式。CPU卡将用户数据以文件的形式存储在EEPROM中,保证访问文件的快速性和安全性。
安全体系:涉及对卡的鉴别与核实,对文件访问时的权限控制机制。
命令解释:根据接收到的命令检查各项参数是否正确,执行相应的操作。
以上这些概念性的东西都是卡与在文档中查到的,因此只说了大概,下面详细讲一下CPU卡发卡的具体流程。
安全机制:
FMCOS的每个目录都有一个安全状态寄存器,共有16中安全状态,用十六进制数0-F来表示。当前目录的安全状态在复位或者重新选择目录后被置为0,在当前目录下的口令校验或者外部认证指令通过后更改安全状态的值为密钥规定的后续状态。
对于FMCOS的所有文件,在创建时都需要设置它的访问权限,包括读权限、写权限、使用权限、更改权限等。用1个字节的十六进制XY数表示。当该目录此时的安全状态值>=Y并且<=X时,则你拥有该文件相应的权限;若X=0,则安全状态>=Y时,你拥有该文件相应的权限;当X=Y时,安全状态=Y才会拥有该文件相应的权限。如果你不想让人让问某个文件,你可以将该文件的操作权限设为XY(Y>X)
发卡:
所需设备:
1、 复旦CPU卡
2、 D8非接触式读卡器
3、 ESAM卡(发卡母卡,里面存储了需要装载到CPU卡内的所有密钥)
4、 PC机
5、 开发语言使用VB2005
发卡流程:
1、 连接读卡器,打开读卡器端口。
2、 寻卡,CPU卡和ESAM卡上电复位,检查CPU卡和ESAM卡是否放在读卡器的正确位置。
3、 首先需要记住的是,无论是对CPU卡还是ESAM卡做任何操作,你都需要选择对应的目录。
4、 对CPU卡做外部认证:
CPU卡MF目录下的Key文件里有一个主控密钥,由该密钥的属性设置来决定你是否有权限对CPU卡进行卡片初始化、MF擦除以及卡结构修改等权限。
所谓外部认证,就是检查你是否有合法的权限对CPU卡进行各种操作。首先你需要拥有主控密钥,通常你并不知道主控密钥的内容(除非是未经初始化过的卡,初始主控密钥由卡片制造商决定,我用的卡初始密钥为全F),主控密钥储存在ESAM卡中,你需要通过SAM卡提供的分散指令(两次通用DES计算),得到主控密钥CCk。然后通过CPU卡提供的取随机数指令,取得8字节随机数sRandom(这个随机数不仅返回给终端,而且还存储在CPU卡内某一位置),用CCK对sRandom做DES加密,得到结果sRet。然后使用外部认证指令将sRet发送到CPU卡,CPU卡使用MF下的主控密钥对sRet做解密,将得到的结果与刚才送给终端的随机数比较,如果相同,则外部认证通过,CPU卡的安全寄存器状态置为主控密钥设置的后续状态,同时你也拥有了该后续状态值所对应的操作的权限。如果认证不通过,错误次数减一,你可以使用另外的主控密钥继续做外部认证,成功则错误次数清0。千万记住错误次数不能超过主控密钥设置的允许最大错误次数(空卡默认是3次),否则将被锁卡。
因为我们不清楚要用来发卡的CPU卡是空卡还是已经初始化过的,所以在做外部认证的时候我们需要先使用厂商提供的初始密钥,再使用ESAM卡中的主控密钥。
5、 擦除MF:
MF默认创建,你只能清除MF下的所有内容,不能删除MF。
6、 建立MF下的文件:
MF的目录结构包括:
- 密钥文件
- 目录数据文件
- 基本文件EF(包括二进制文件、记录文件等)
- 目录文件DF
密钥文件是你在创建一个目录时首先需要建立的,密钥文件里的各种密钥控制你对该目录以及该目录下内容的操作权限。
指令:80E00000073F005001AAFFFF
文件标识:0000
文件类型:3F
文件空间:0050(关于文件空间的设置,参加:文件空间)
读权限:01
写权限:AA
密钥文件建立后,你需要向其中写入各种密钥,包括主控密钥、维护密钥等。
然后是创建目录数据文件,变长记录文件,说明MF下有哪些目录。
最后创建EF和DF
7、 建立3F01目录下的文件
通用先建立Key文件并向Key文件中装载密钥
由于3F01是ADF,所以不需要创建目录数据文件
再建立电子钱包/存折文件、电子钱包交易明细记录文件等
电子钱包/存折文件、电子钱包交易明细文件都是由PBOC规定了如何来创建维护的。
8、 其他目录的创建方法同上
文件空间
文件头:11字节(文件类型+文件标识符+文件主体空间大小+权限+校验等)
每个基本文件所占的EEPROM空间:11字节文件头+文件主体空间
定长、普通钱包和循环文件的主体空间:记录个数x记录长度(密钥文件的记录长度为数据长度+8)
每个DF所占的EEPROM空间:11字节DF头+DF下所有文件的空间和+DF名称长度
安全报文传送
三种情况:
- 线路保护:对传输的数据附加4字节的MAC码,接收方收到后首先进行校验,只有校验正确的数据才予以接受,这样就防止了对传输数据的篡改。
- 线路加密:对传输的数据进行DES加密,这样传输的就是密文,攻击者即使获得了数据也没有意义。
- 线路加密保护:对传输的数据进行DES加密后再附加4byte MAC码
如何使用安全报文传送:
在建立文件时改变文件类型,使用线路保护则最高位置为1,使用线路加密则次高位置为1,使用线路加密保护则最高位和次高位都置为1.
在对文件进行读写或使用密钥时,如需采用安全报文传送,必须置CLA的后半字节为十六进制“4”
线路保护MAC计算:
假设创建了一个二进制文件,使用线路保护,文件标识0x16,文件空间0x20。
则向二进制文件中写数据的指令为:
04D6960024 + val + mac
其中CLA为04,因为文件使用线路保护,所以后半字节为4
INS为D6
P1为96,其中高3位为100,低5位为文件标识
P2为00,为欲写文件的偏移量
Lc为24
val为要写入到二进制文件中的数据,0x20个字节
mac就是我们需要计算的线路保护mac
而mac又是根据写指令去除mac部分计算得到的,即是根据“04D6960024 + val”计算得到的。
Mac计算步骤:
1、 终端向CPU卡发送GET CHALLENGE指令,取得4字节随机数,后补“0x00000000”,得到的8字节结果作为MAC计算的初始值。
2、 检查“04D6960024 + val”的字节数是否为8的倍数,不是则补“0x8000…”,是则补“0x8000000000000000”,然后将得到的结果按8字节每块分成D1、D2、D3…
3、 判断密钥的长度。
如果密钥长度为8字节,则按如下方式计算MAC:
如果密钥长度为16字节,则按如下方式计算MAC:
使用SAM卡计算MAC:
1、 终端向CPU卡发送GET CHALLENGE指令,取得4字节随机数,后补“0x00000000”,得到的8字节结果作为MAC计算的初始值。
2、 通用DES初始化
80 1A + P1(密钥用途)+ P2(密钥版本)+ Lc + DATA(分散因子)
3、 通用DES计算
80 FA + P1 + P2(00) + Lc + DATA(8字节随机数+)+ “04D6960024 + val + 0x8000…”
这里P1的取值是关键:00001001,即05,代表有初始值的MAC计算
返回数据即为4字节MAC
线路加密计算:
具体计算方式同DES/3DES算法,这里介绍的是如何使用SAM卡加密。
1、通用DES初始化
80 1A + P1(密钥用途)+ P2(密钥版本)+ Lc + DATA(分散因子)
2、通用DES计算
80 FA + P1 + P2(00) + Lc + “明文”
这里P1的取值是关键:00000000,即00,代表无后续快的加密计算
返回数据即为加密得到的密文
充值
脱机充值
1、 选择要充值的应用目录。
2、 验证口令密钥。
3、 取得充值密钥(这里使用加密机提供的分散指令,用ATS作为分散因子对00B0密钥进行分散得到充值密钥)。
4、 圈存交易初始化。
5、 生成过程密钥。
6、 用过程密钥计算MAC1与初始化交易返回的MAC1进行比对,若一致,则继续执行。
7、 用过程密钥计算MAC2。
8、 使用圈存指令将MAC2发送给CPU卡,完成充值交易。
联机充值
1、2、3、4步同脱机充值。
将圈存交易初始化返回的数据发送给后台,后台算出过程密钥,并得到MAC1。由后台对MAC1作比较,如果一致,则后台再算出MAC2,返回给前台,前台使用圈存指令将MAC2发送给CPU卡,完成充值交易。
消费
1、 选择要消费的应用目录。
2、 取得消费密钥(这里使用加密机提供的分散指令,用城市代码和ATS作为分散因子对00B1密钥进行分散得到消费密钥)。
3、 消费交易初始化
4、 生成过程密钥
5、 用过程密钥计算MAC1
6、 用消费指令将MAC1发送给CPU卡进行消费交易
7、 得到TAC和MAC2,验证…
复合消费主要面向于交通领域的应用,既可以满足高速公路不停车收费系统的需求,也可以满足城市公共交通的应用需求。
复合消费相对于普通消费来说多了一个对复合记录文件的更新。比如在高速公路入口或者乘客上车时先做一次金额为0的复合消费,从而正确记录入口或者上车站点的相关信息,之后在高速公路出口或者乘客下车时,读取之前记录的信息,计算出实际费用,做一次完整的复合消费交易,这样就可以实现高速公路或者公共交通中的分段收费功能。
具体消费流程:
1、 选择要充值的应用
2、 得到PSAM卡或加密机中得到消费子密钥
3、 进行复合交易初始化
4、 计算过程密钥
5、 利用过程密钥计算MAC1,这里交易类型为09
6、 更新复合应用数据缓存(P1为卡中复合记录文件原记录的复合消费标志)
7、 发送MAC1进行消费
ps:复合记录文件的命令报文数据域的byte7为EF(使用线路保护读,读写都使用标识为00的密钥)