【转】CPU卡知识入门教程

原文:http://solution.rfidworld.com.cn/2012_07/ca29975245fe241d.html

绪言: 
说起CPU卡,人们肯定不禁要问,什么是CPU卡,CPU卡长什么样的呢? 
想起卡,一般人接触最多的是银行卡,相信现在大家每个人的钱包里都有好几张磁卡。比如说:有工商行、建行的储蓄卡。 
但我们所说的CPU卡,是卡上面有个芯片的卡,现实生活中接触最多的应该是IC卡电话卡、买电的卡。 
但以上的卡都不是CPU卡,长得和电话卡、买电的卡一样。但卡的芯片里有CPU,我们手机里用的SIM卡就是CPU卡的一种。 
我们可以把CPU卡想象成一个极小的个人计算机,但这个计算机没有显示器,没有电源,没有输入设备。要使用CPU卡的时候,必须由外部提供电源、显示屏和输入设备。 
比如说现在我要往手机的SIM卡内存入一个电话号码. 
1、我的手机必须有电---提供电源 
2、我的手机必须有提供输入电话号码的手机按键--提供输入 
3、我的手机必须能有显示电话号码的显示屏---提供显示 
以上我们对CPU卡有了大概的了解,有可能比喻不是很恰当。 

第一章    我们为什么要使用CPU卡呢? 
先谈谈银行磁卡的不安全性,经常去ATM取钱的必须注意如下事项: 
1、输入密码的时候必须防止被别人看到,最好能用手遮着。 
2、取完钱一定要取走打印的单据,或者不打印单据也行。 
看看犯罪分子怎样窃取你卡片里头的钱: 
1、在你取钱的时候凑在你旁边,偷偷得记下你的密码,或者在很远的地方用望远镜窥视你的密码。 
2、你取完钱走后,有可能安全意识不高,没有取走打印的单据,犯罪分子就乘机取走单据,取走单据的目的是为了知道你的卡号。 
有了上面两点, 
首先:犯罪分子先复制一张和你的银行卡一摸一样的银行卡。并且复制的成本非常低,只要有一台PC,一个磁卡写卡器(价格很便宜),一个小软件。 
其次:犯罪分子又已经有了你的密码。 
这样,犯罪分子就可以拿着你的卡去潇洒地消费、取钱了,而你却还蒙在鼓里。直到某一天,当你发现你的卡里的钱突然变少了,或者没了,但一切为时已晚。 
为什么会出现这种情况呢? 
那就是磁卡太容易就可以被复制。那我们必须去寻找一种不能被复制的卡,什么卡呢?这就是CPU卡。而CPU卡又属于IC卡的一种。 
什么是IC卡呢?IC卡分为几种呢? 
IC卡是英文"集成电路卡"的缩写,是近年来传入中国的一项新技术。它是把具有存储、运算等功能的集成电路芯片压制在塑料片上,使其成为能存储、转载、传递、处理数据的载体。 
IC卡从其功能上分为三种: 
1) 存储器卡。 
2) 带加密逻辑存储器卡:内有COS(卡操作系统)的一种存储器卡。 
3) CPU智能卡:内有CPU(中央处理单元)的一种存储器卡。 
以上三种卡只有CPU卡被证实是最安全的。 

第二章   CPU卡在实际情况中是怎么使用的呢? 
CPU卡使用的简单情况举例:(如图) 
硬件: 
一台PC+一个读卡器+一张CPU卡 
读卡器和PC是通过串口进行通讯,这种做法比较常见。 
软件: 
一个在PC上运行能读写CPU卡的小程序 
(一般读卡器提供商都会提供开发CPU卡的函数接口和读写CPU卡的小工具) 
对CPU卡的操作的流程是怎样的呢? 
1、PC上的CPU卡读写程序向PC的串口(比如说串口1)发指令 
2、读卡器和串口1是连在一起的,串口的指令传到读卡器 
3、读卡器又把指令传给CPU卡 
4、CPU卡内部执行指令,返回消息 
那指令的格式又是什么样的呢? 
我们可以举这么一个例子: 
用过DOS的人都知道: 
CD C:\ 
这个指令表示进入C盘根目录 
相应的CPU卡有这么一个指令:SELECT MF 
这个指令表示进入卡片的根目录,但由于CPU卡的操作系统 
比较简单,它处理不了这种纯粹字符的东西,向卡片指令的时候必须 
把指令转换成十六进制的格式: 
转换成卡片的指令格式是:00 A4 00 00 02 3F 00 
每个字符的具体规定在ISO7816-4中有具体的规定。 
大家有兴趣的话可以去查具体的标准,以下是比较枯燥的IC卡的国际标准: 
1、物理特性 符合ISO7816:1987中规定的各类识别卡的物理特性和ISO7813中规定的金融交易卡的全部尺寸要 
求,此外还应符合国际标准ISO7816— 1:1987规定的附加特性、机械强度和静电测试方法。 
2.触点尺寸与位置。 应符合国际标准ISO7816—2:1988中的规定。 
3.电信号与传输协议。 IC卡与接口设备之间电源及信息交换应符合ISO/IEC7816— 3:1989的规定。 
4.行业间交换用命令。 有相应的国际标准ISO/IEC7816—4:1994。但该版本尚未正式通过。 
5.应用标识符的编号系统和注册过程应符合国际标准ISO/IEC7816— 5:1994中的规定。 感应式智能卡的国 
际标准有:ISO\IEC10536-1:1992、ISO\IEC10536-2:1995、ISO\IECDIS10536-3:1995、ISO14443-2等。 

第三章   多应用究竟是什么呢? 
对于CPU卡,人们经常关注的是CPU卡的多应用,也就是说一张CPU卡上可以有多个应用, 
多应用的安全相互隔离,那么多应用究竟是什么呢? 
我们可以把卡片想象成一栋县政府办公大楼,比如说: 
一楼:属于民政部门 
二楼:属于教育部门 
三楼:属于交通部门 
... 
各个部门独立办公,互不干涉,在行政上他们并没有从属关系。从而达到了多应用并存。 
民政部门智能办理民政部门的事情,教育部门只能办教育部门的事情。从而达到了多应用的安全相互隔离。 
一、多应用并存于一张卡片上 
多应用共存在卡片上是怎么达到的呢? 
通过创建多个ADF(即创建多个目录)达到。 
每个ADF代表一个应用。每个ADF下有相应的文件,相应的 
文件中存放相应的数据。 
二、多应用之间的安全相互隔离 
多应用之间的安全相互隔离是怎么达到的呢? 
通过卡片内部的安全机制来实现。 

第四章   CPU卡的文件结构1 
CPU卡作为信息的载体,在卡片里必须能存储信息,比如说,存放一个人的身份信息在CPU卡上(包括姓名、年龄、工作单位、职务、电话等),这些具体的信息在CPU卡中是怎么存放的呢? 
请听我细细道来。 
   在这个时候,我们可以把CPU卡想象为一张软盘,只不过软盘的容量比CPU卡大得多,我们现在软盘的容量一般为1.4M字节,而我们现在常用的CPU卡的容量仅仅为8K或者16K字节,远远比软盘的容量小。当然了,容量越大的CPU卡价格越贵。 
请看下面例子 
假设我们把以上所说的一个人的身份信息存放在pm.txt中。 
pm.txt在一张软盘中的存放方式 
方式一:A:\pm.txt 
方式二:A:\adf1\pm.txt 
方式三:A:\ddf1\adf1\pm.txt 
以上是信息在软盘中的存放方式。 
大家请看ISO7816-4规定的CPU卡内逻辑文件组织结构的举例,见下图: 
大家可以可以看到最多只有三层目录。这是由于实际应用中只要有三层目录就够了。 
所以现在的CPU卡一般都是最多只支持三层目录的,有的国外的卡只支持两层目录(实际上两层目录一般时候也够用)。 
请看下面例子(可以对比软盘的方式看) 
假设我们把以上所说的一个人的身份信息存放在EF1中。 
方式1:MF        方式2:MF             方式3:MF 
       \                 \                     \ 
        EF1             ADF1                   DDF1 
                          \                      \ 
                          EF1                   ADF1 
                                                   \ 
                                                   EF1  
由于CPU卡的文件操作系统远比DOS或者WINDOWS操作系统简单,说句不好听的话,可以说是“小巫见大巫”。不过这可以理解,毕竟在这么小的一个芯片上暂时不能实现象DOS或者WINDOWS那样强大的操作系统。 
所以对文件的规定,对文件的创建、文件的操作比较麻烦。 
不同之处在于: 
1、CPU卡创建一个文件时必须先声明创建的文件的类型以及创建文件的空间大小。 
   在软盘或者硬盘上则可以不指定文件长度。    
2、CPU卡创建完一个文件后不可以删除。(测试发卡的时候可以例外,但删除的是MF,即删除卡片中的所有文件和目录) 
3、CPU卡文件类型只有很少几种,没有后缀名。 
4、CPU卡创建文件、写文件必须通过向卡片发送APDU报文的方式进行,并且每次写的字节数不能超过256字节,比较麻烦。 

第五章   CPU卡的文件结构2 
CPU卡入门教程6---CPU卡的文件结构2 
【CPU卡的文件类型】 
<两种专用文件(DF--Dedicated File)类型> 
MF(Master File): 
根目录,是卡片文件系统的根,相当于DOS的根目录,每张卡有且只有一个MF文件。 
不同卡片厂商的MF的创建方式是不同的。 
主要有两种方式: 
1、在卡片个人化过程中由发卡方创建。如明华、德生卡片 
2、厂商提供卡片的时候已经创建,发卡方不能再创建。如握奇卡片 
DF(Dedicated File): 
DF相当于DOS的子目录。 
DDF和ADF: 
我们把包含下级目录的DF称之为DDF,不包含下级目录的称之为ADF。 
注意:DDF下可以有ADF,ADF下不能再有ADF。 
<三种基本文件(EF--Elementary File)类型> 
一、透明文件: 
基本文件存储了各种应用的数据和管理信息,它存在于MF和DF下。文件数据是通过 
连续空间中的字节地址进行存取。 
比如上节中说的个人身份信息就可以存放在透明文件中。 
二、记录文件: 
数据是以记录的方式存放在文件中的。 
记录文件分为以下几种: 
1、线性定长记录文件: 
一个文件中有n条记录,每条记录的长度都是固定且相等的。 
2、线性变长记录文件: 
文件中的每个记录的长度是可变的。但一旦写完后,进行更新的时候,更新的记录长度 
必须和原来的记录长度相同。 
变长记录的TLV格式如下: 
T=TAG:标识 
L=LENTGTH:长度 
V=value:值 
3、循环定长记录文件: 
一个文件中所有记录是等长度的,对文件中的记录循环进行读取。 
在逻辑上,这类文件可看作一个环形记录队列,记录按照先进先出的原则存储。 
添加记录时,最新一次写入的记录的记录号为1,上一次写入的记录的记录号为2, 
依次类推,滚动写入。 
三、交易文件 
这一类的文件为特定格式的文件,通过具体的交易指令对这类文件进行操作。 
如: 
1、电子存折文件 
2、电子钱包文件 
<安全文件> 
此类文件是和安全有关的文件,所以对文件的访问控制就特别严格,对文件只能进行 
写入,文件是不可读的。 
文件内存放有关卡片安全的密钥和口令。 
但或许大家有疑问,文件要是不可读,那这文件还有什么用呢? 
在实际中它是这么被使用的,比如说我们要使用某个密钥,在卡片中每个密钥都有编号, 
我们在使用中通过指定卡片的密钥号(即:我们使用的是第几号密钥)来使用密钥。 
比如说我们使用口令,我们通过向卡片送入口令来进行使用口令。 
而具体的比对口令和用密钥的计算是在卡片的内部进行了。 
所以这种措施保证了卡片的密钥和口令的安全。 

第六章    对CPU卡中文件的操作 
我们有什么办法可以对文件操作呢? 
比如我们要对个人基本信息文件pm.txt进行操作,在DOS下我们可以用EDIT pm.txt进行编辑, 
在WINDOWS下我们可以双击pm.txt,用文本编辑器打开文件。 
但在CPU卡中,我们怎么对一个文件(比如说EF1)进行操作呢? 
比如说我们要打一个人,我们必须先找到那个将要倒霉被打的人。 
同样,我们要对一个文件操作,首先,我们必须先找到要操作的那个文件。 
那我们怎们找到CPU卡中的文件呢? 
我们查找某人,可以查找他(她)的身份证号来找到他,CPU中卡的每个文件是否也有 
他们的身份证号呢? 
有的:那就是文件标识,CPU卡中的文件通过文件标识表标记一个文件。 
找一个人,还可以通过他(她)的名字来查找,找CPU卡中的文件呢?很遗憾, 
对MF和DF有关目录的文件有它们的文件名,其它文件则没有文件名。 
<文件标识符与文件名称> 
文件标识符是文件的标识代码,用2个字节表示,为什么只有2个字节呢?因为2个字节足矣,2个字节 
FFFF=65535。 
在选择文件时只要找出该文件的标识,就可以找到该文件。同一目录下的文件标识符是唯一的。 
MF的文件标识符为3F00,文件名自定义,符合银行规范名称应该是1PAY.SYS.DDF01, 
当然了,社保的卡规定的就不是这个名字了。 
所有文件可以通过文件标识符用SELECT命令进行选择,目录文件DF可以通过目录名称进行选择。 
短文件标识符: 
由于对CPU卡文件的操作要求节省空间并且方便操作。 
于是好像便出现了短文件标识符这个东东。 
所谓短文件标识符,在字面上的意思就是比文件标识符短。好像实际上也是这样。 
大家看看,短文件标识符只用1个字节来表示,并且只用1个字节低五位来表示。 
同一个目录下的文件短标识符必须是唯一的。 
短文件标识符可以通过Read Binary、Update Binary命令的参数P1来实现文件的 
选择:若P1的高三位为100,则低5位为短文件标识符。例如:若P1为81H,即10000001, 
其中高三位为100,则所选的文件标识符为00001,十六进制文件标识表示为00 01。 
短文件标识符选择还可以通过Read Record、Update Record命令参数P2来实现文件的选择, 
方法是若P2的高五位不全为0,低五位为100,则高五位为短文件标识符。对于命令 
Append Record低五位为000来表短文件标识符。 
短文件标识符选择只能用五位来决定文件标识符,所以可选择的最大文件标识为31, 
若文件需要短文件标识符进行选择,则建立文件时就需将文件标识符取在1-31之间。 
<文件的访问> 
上一节中规定了那么多种文件,那么,究竟该怎么对那些文件进行访问呢? 
MF: 
在CPU卡被复位后自动被选择,在任何一级子目录下可通过文件标识3F00或其文件名来选择MF 
DF 
通过文件名或文件标识符来选择DF,在MF下可以选择任意DF。 
如果当前文件是一个DF下的一个EF,同样可以通过选择DF的文件标识符或文件名来选择任意DF。 
二进制文件: 
在满足读条件时可使用Read Binary读取,在满足写条件时可用Update Binary来更改二进制文 
件的内容。 
定长记录文件: 
在满足读条件时可使用Read Record读取,在满足写条件时,若记录未满则用Append Record增加 
新记录,若记录已满则用Update Record来更改指定记录的内容。 
循环定长记录文件: 
在满足读条件时可使用Read Record读取,在满足追加条件时可使用Append Record在文件末尾追加 
一个记录,当记录写满后自动覆盖最早写的记录,最后一次写入的记录,其记录号总是1,上次写入 
的记录号是2,依次类推。 
变长记录文件 
在满足读条件时可使用Read Record读出记录,在满足写条件时若记录未满则用Append Record增加 
新记录,若记录已满则用Update Record来更改指定记录的内容。变长记录文件的格式为TLV格式, 
Tag为1字节的记录标识,L为1字节的记录数据长度,V为L字节的数据值。在执行Update Record更改 
已存在的记录时,新写的整条记录长度必须和原来的整个记录长度相等,否则将返回错误。 
cpu卡入门教程8-安全篇[原创] 
问题的引出: 
假如说你现在手中有6份重要文件 
1、房契 
2、银行存折 
3、毕业证书 
4、户口本 
5、某某人欠你的100万块钱的欠条(呵呵,假装你有这么多钱,你是百万富翁并且很慷慨,一个好人) 
6、结婚证(这个好像已婚人士才有) 
这些对我们来说都是比较重要的东东,一定要妥善的安全的保存啊!你可以这么保存: 
方法1: 
把这些文件锁在六个保险柜里,一个柜子放一个文件 
方法2: 
把六个文件全部锁在一个保险柜里 
方法3: 
把六个文件锁在n个保险柜里,这个n比6小又比1大 
方法4: 
把文件放在一个小保险柜里,把小保险柜放进大保险柜里,或者你觉得很好玩的话,再把大保险柜放进大大保险柜里,如此一个保险柜再套另一个保险柜,只要你有钱、只要你还想套、我不反对。 
在CPU卡中的文件的存放也会存在这些问题,比如说你有6个文件,你想存放在CPU卡的某个应用中。 
考虑到安全问题,CPU卡的文件安全及访问机制是由通过认证来实现的(如认证密钥、认证PIN,想进一步了解可 
以参考我写的文章:内、外部认证深入剖析: 
我们现在以认证是通过密钥的认证来说明: 
方法1: 
6个文件用6个密钥来保护,每个文件对应一个密钥 
方法2: 
6个文件只用一个密钥来保护 
方法3: 
6个文件进行归类,用n个密钥保护,这个n比6小又比1大 
方法4: 
文件用密钥套密钥保护。 
比如说文件1用密钥1保护、密钥1的使用又必须通过密钥2的认证。或者下面还更复杂密钥2的使用必须通过密钥3的认证。 
你可以把密钥想象成保险柜的钥匙,小保险柜的钥匙必须在大保险柜的控制下使用。(意思就是:小保险柜的钥 
匙必须在大保险柜的钥匙打开了大保险柜之后才能起作用,这话好像有些拗口,跟绕口令试的,呵呵) 
其实一般的保险柜都要密码的,也就是说保险柜的钥匙要和密码配套使用,两者缺一不可,好像看起来这样做 
会更保险一点,事实上也是。至于是先开钥匙后输入密码还是先输入密码再开钥匙,这主要看保险柜的设计。 
在CPU卡中可以实现,CPU卡可以用用户密码加上卡上密钥的方法实现。可以设计成两种模式: 
方式1、在密钥认证成功后,密码才可以使用。 
方式2、在密码的验证成功后,密钥才可以被使用。 
这必须按顺序来,如方式一,你要是想先验证密码,对不起,卡片会给你一个提示:安全状态不满足。 
这时候,你必须做的工作是,现对密钥进行认证,密钥认证成功后,再验证密码就不会提示安全状态不满足了。 
以上机制好像听起来比较复杂,但其实也并不复杂。(谈何容易,或许你会这么说) 
在卡片中,现在比较流行的并且实现起来也挺简单的的方法:状态机机制 
一个CPU卡文件的安全认证设计,涉及到3方面的状态: 
1、系统当前的安全状态 
2、对文件操作必须满足的状态 
3、密钥的状态 
我们再以保险柜为例: 
比如说我们想查看保险柜的那张100万欠条的内容。 
1、对应的系统的当前状态:保险柜关闭状态 
2、对文件操作必须满足状态:保险柜打开状态 
怎么使系统的的当前状态:保险柜关闭状态 变成对文件操作必须满足状态:保险柜打开状态呢? 
我们使用保险柜的钥匙来打开保险柜。 
3、使用钥匙后的后续状态:保险柜打开状态 
这样我们实现了对文件的操作。 
在CPU卡中,状态可以用一个数字来表示:比如说0 
我们定义: 
1、系统缺省的当前安全状态:0 
2、对文件操作必须满足的状态:6 
3、密钥的后续状态:6 
步骤: 
1、直接对文件进行操作,文件比较“系统的缺省状态:0” 不等于 “对文件操作必须满足的状态:6” 
提示,安全状态不满足。 
2、我们对密钥进行认证,认证通过后,把“密钥的后续状态:6”赋值“系统缺省的当前安全状态” 
这样“系统的缺省状态=6” 
3、下面我们再对文件进行操作,文件比较“系统的当前状态:6” 等于 “对文件操作必须满足的状态:6, 
可以对文件进行操作 
安全状态的表示: 
实际使用中一般用1个字节(16进制)来表示状态, 
低4位表示安全级别下限(0-15),高4位表示安全级别上限(0-15) 
假设一字节的值为:XY  (0<=X <=F)  (0<= Y <=F) 
现在以文件的状态来说明: 
假设文件的状态为: 
1、0Y(如:01,02,03,04....),表示对文件的访问无安全限制(即这个文件随便都可以访问) 
2、如果X>Y (如:10, 32, 85等),表示这个文件被禁止访问 
3、如果X<=Y (如:13,11,33,38),表示对文件进行访问前,必须满足文件的访问权限。 
比如说文件的访问权限是:13,现在的权限必须是1、2或者是3才可以访问文件 
比如说文件的访问权限是:38,现在的权限必须是3到8的值才可以访问文件 
比如说文件的访问权限是:33,现在的权限必须是3才可以访问文件 
系统一般都会规定一个缺省的权限:比如说0 

==================END=========================

 

posted @ 2019-09-06 11:15  dozeoo  阅读(6089)  评论(0编辑  收藏  举报