参考文档:
《新版FMCOS2.0用户手册.pdf》
《Cpu卡操作的基本方法指令.pdf》
00 B0 96 00 06
3B 79 18 00 00 50 53 4D 5F 54 43 31 30 30
3B 79 18 00 00 50 53 4D 5F 54 43 31 30 30
00 B0 96 00 06 B0 01 53 00 02 9D 95 90 00
00 B0 95 00 0A B0 53 01 01 01 00 00 00 17 14 13 90 00
3B 79 18 00 00 50 53 4D 5F 54 43 31 30 30
3B 79 18 00 00 50 53 4D 5F 54 43 31 30 30
00 B0 96 00 06 B0 01 53 00 02 9D 95 90 00
00 B0 95 00 0A B0 53 01 01 01 00 00 00 17 14 13 90 00
00,B0,83,00,06,
00A4000000
00C000000F
BYTE ucSendBuf[5] = {0x00,0xC0,0x00,0x00};
ucSendBuf[4] = SW2;
00a40000023f00
00 B0 96 00 06
01 53 00 02 9D 95 90 00
代码 | 值 |
---|---|
CLA | 00 |
INS | B0 |
P1 | xx |
P2 | xx |
Lc | 不存在;(CLA=04 时除外) |
Data | 不存在;(CLA=04 时,应包括MAC) |
Le | 要读取数据的长度 |
若P1 的高三位为100,则低5 位为短的文件标识符,P2 为读的偏移量。
若P1 的最高位不为1,则P1 P2 为欲读文件的偏移量(P1 为偏移量高字节,P2 为低字
节),所读的文件为当前文件。
例子:
1]:文件标识符为0005 的二进制文件,文件主体空间的大小为8 个字节,建立时不采
用线路保护。
读出自偏移量01 开始到文件结束的所有数据,不进行线路保护,则命令为:
00 B0 85 01 00
由卡片返回的响应数据为:
11 22 33 44 55 66 77 9000
INS = E0 :Create File建立文件,包括MF,DF 和EF
80E000160728001EF0F0FF02
最后的02 是和密钥相关的
代码 | 值 | 例子 |
CLA | 80 | 80 |
INS | E0 | E0 |
P1 | 文件标示(File ID) | 00 |
P2 | 16 | |
Data | 文件控制信息和DF 名称 | 0728001EF0F0FF02 |
Le | 要读取数据的长度 |
目录文件格式:(包括DF MF ,不包括 EF)
80,E0,3F,01,0D,
38,05,20,F0,F0,95,FF,FF,44,44,46,30,31,
长度 | 文件类型 | 文件空间 | 建立权限 | 擦除权限 | 应用文件ID | 保留字 | DF名称 |
---|---|---|---|---|---|---|---|
1字节 | 1字节 | 2字节 | 1字节 | 1字节 | XX | FF FF | 5到16字节 |
0 | byte1 | byte2-3 | byte4 | byte5-6 | |||
0D | 38 | 05 20 | F0 | F0 | 95 | FF FF | 44 44 46 30 31 |
基本文件EF格式(包括密钥文件,不包括DF,MF)
文件类型 | 文件类型 | 文件空间 | 读权限 | 写权限 | 保留字A | 保留字B |
---|---|---|---|---|---|---|
文件类型 | byte1 | byte2-3 | byte4 | byte5 | byte6 | byte7 |
二进制文件 | 28 | 文件空间 | 读权限 | 写权限 | FF | 见说明 |
定长记录文件 | 2A | 文件空间 | 读权限 | 写权限 | FF | 见说明 |
循环文件 | 2E | 文件空间 | 读权限 | 写权限 | FF | 见说明 |
PBOC ED/EP | 2F | 02 08 | 使用权限 | 保留(00) | FF | 交易记录短标识 |
变长记录文件 | 2C | 文件空间 | 读权限 | 写权限 | FF | 见说明 |
密钥文件 | 3F | 文件空间 | DF文件短标识符 | 增加权限 | FF | FF |
所有文件建立后不能被自动选择
Send Data :00,A4,00,00,00,
Recv Data:61,0F,
Send Data :00,C0,00,00,0F,
Recv Data:6F,0D,84,06,46,4D,53,48,4D,46,A5,03,88,01,01,90,00,
Send Data :00,84,00,00,04,
Recv Data:CA,E9,FD,62,90,00,
Send Data :00,82,00,00,08,DD,4D,2C,FC,5F,31,D6,7E,
Recv Data:90,00,
Send Data :80,0E,00,00,00,
Recv Data:90,00,
Send Data :00,A4,00,00,00,
Recv Data:61,0A,
Send Data :00,C0,00,00,0A,
Recv Data:6F,08,84,06,46,4D,53,48,4D,46,90,00,
Send Data :80,E0,00,00,07,3F,00,B0,01,F0,FF,FF,
Recv Data:90,00,
Send Data :80,D4,01,00,0D,39,F0,F0,AA,55,FF,FF,FF,FF,FF,FF,FF,FF,
Recv Data:90,00,
Send Data :80,E0,3F,01,0D,38,05,20,F0,F0,95,FF,FF,44,44,46,30,31,
Recv Data:90,00,
Send Data :80,E0,00,01,07,3F,01,8F,95,F0,FF,FF,
Recv Data:90,00,
Send Data :80,D4,01,01,08,3A,F0,EF,44,55,12,34,56,
Recv Data:90,00,
Send Data :80,E0,00,03,07,28,00,1E,F0,F0,FF,02,
Recv Data:90,00,
Send Data :80,E0,00,04,07,28,00,0F,F4,F0,FF,02,
Recv Data:90,00,
Send Data :00,A4,00,00,02,00,03,
Recv Data:90,00,
Send Data :00,D6,00,00,05,01,02,03,04,05,
Recv Data:90,00,
Send Data :00,A4,00,00,02,00,04,
Recv Data:90,00,
Send Data :00,D6,00,00,06,11,22,33,44,55,66,
Recv Data:90,00,
Send Data :00,B0,83,00,06,
Recv Data:01,02,03,04,05,00,90,00,
SmartCard Reader Cnt dw =1,
i=0,Gemplus USB Smart Card Reader 0
Gemplus USB Smart Card Reader 0
连接读卡器: Gemplus USB Smart Card Reader 0
通讯协议: T0
Send Data :00,B0,83,00,06,
Recv Data:01,02,03,04,05,00,90,00,
00,A4,00,00,02,3F,01,
80E000160728001EF0F0FF02
80E000150728001EF0F0FF02
00,A4,00,00,02,00,16,
00,D6,00,00,06,01 ,53 ,00 ,02 ,9D ,95
00,A4,00,00,02,00,15,
00,D6,00,00,0A,53 ,01,01 ,01 ,00, 00, 00, 17 ,14 ,13
00 B0 96 00 06
00 B0 95 00 0A
FM1216 开卡指令:
SmartCard Reader Cnt dw =1,
i=0,Gemplus USB Smart Card Reader 0
Gemplus USB Smart Card Reader 0
连接读卡器: Gemplus USB Smart Card Reader 0
通讯协议: T0
Send Data :00,84,00,00,04,
Recv Data:80,3E,F2,2C,90,00,
Send Data :00,82,00,00,08,6B,23,4F,74,12,6F,4C,9A,
Recv Data:90,00,
Send Data :80,0E,00,00,00,
Recv Data:90,00,
Send Data :00,A4,00,00,00,
Recv Data:61,12,
Send Data :00,C0,00,00,12,
Recv Data:6F,10,84,0E,31,50,41,59,2E,53,59,53,2E,44,44,46,30,31,90,00,
Send Data :80,E0,00,00,07,3F,00,B0,01,F0,FF,FF,
Recv Data:90,00,
Send Data :80,D4,01,00,0D,39,F0,F0,AA,55,FF,FF,FF,FF,FF,FF,FF,FF,
Recv Data:90,00,
Send Data :80,E0,00,16,07,28,00,1E,F0,F0,FF,02,
Recv Data:90,00,
Send Data :80,E0,00,15,07,28,00,1E,F0,F0,FF,02,
Recv Data:90,00,
Send Data :00,A4,00,00,02,00,16,
Recv Data:90,00,
Send Data :00,D6,00,00,06,01,53,00,02,9D,95,
Recv Data:90,00,
Send Data :00,A4,00,00,02,00,15,
Recv Data:90,00,
Send Data :00,D6,00,00,0A,53,01,01,01,00,00,00,17,14,13,
Recv Data:90,00,
Send Data :00,B0,96,00,06,
Recv Data:01,53,00,02,9D,95,90,00,
Send Data :00,B0,95,00,0A,
Recv Data:53,01,01,01,00,00,00,17,14,13,90,00,
上述开卡是使用的是如下的软件:
用到的卡片为 复旦FM1216-109 纯16k 双界面卡(即可以接触式,也可以非接触式),淘宝买的
复旦卡的初始密钥为: FFFFFFFFFFFFFFFF
在主目录下建立密钥文件,和建立 16和15两个二进制文件,需要在开卡的时候一次性完成,卡片掉电之后,在主目录再次建立别的二进制文件,会出错。具体原因应该是和卡的机制有关。这句话可能是个人的一个错误的判断,有空验证一下。
\ETC_SmartCard\my_doc\CardIssue1\CardIssue1
复旦 1208出厂初始主控密钥为 8 个字节的FF,即 FFFFFFFFFFFFFFFF
执行指令时返回有 9000表示执行成功!
- 00A4000000 选择 MF 下的根目录 返回值为
6F15840E315041592E5359532E4444463031A5038801019000 具体意思查阅卡系
统手册(FMCOS)
2.外部认证
2.1 取 4 个字节的随机数 0084000004
2.2 用 8 个字节的 初始密钥 FFFFFFFFFFFFFFFF 和 4 随机数 +00000000 进
行解密 生成 8字节解密数据 (用DES 函数计算得出)
注意,对密钥的加密解密是一个逆过程,原理一样的.
2.3 发送 0082000008+8字节密文数据
例: 取出的随机数为 73 87 10 10 然后在 DES程序里,输入如下:
src1[0]=0x73;
src1[1]=0x87;
src1[2]=0x10;
src1[3]=0x10;
src1[4]=0x00;
src1[5]=0x00;
src1[6]=0x00;
src1[7]=0x00;
卡密钥:
key1[0]=0xff;
key1[1]=0xff;
key1[2]=0xff;
key1[3]=0xff;
key1[4]=0xff;
key1[5]=0xff;
key1[6]=0xff;
key1[7]=0xff;
然后执行函数:Single_DES_Decrypt_Encrypt(1,src,key1,result); // 1 表 示 解 密 ,
src 明文 KEY1 密钥, result密文
result1返回的 8 个字节就是你要的密文数据了,如下图:
result1[0]=0X1B;
result1[1]=0XE4;
result1[2]=0X98;
result1[3]=0X0C;
result1[4]=0X1F;
result1[5]=0X32;
result1[6]=0XF2;
result1[7]=0X61;
- 删除 MF下的所有文件指令:800E000000
返回 01 由于擦除命令时间较长需等待,当返回0900 后,表示擦除成功! 建立 MF目录下的密钥文件
先选择根目录: 00A4000000
然后执行建密钥文件命令: 80E0 0000 07 3F00B0 01F0 FFFF
说明: 80E0 :指令类别和指令码; 0000 :文件标识; 07:长度; 3F :文件类型,此为密钥
文件.
00B0: 所建文件可用的空间,即可用 0XB0 个字节的空间; 01 :读权限; F0 :写权
限.
07表示后面有7个字节
01 :读权限;
01表示没有读的权限
F0表示可以任意写密钥文件建好后就要给其增加密钥了
执行指令: 80D4 0100 0D 39 F0F0 AA55 FFFFFFFFFFFFFFFF
说明: 80D4 :指令类别和指令码; 0100 :文件标识; 0D:长度; 39 :文件类型,此为外部
认证密钥
0D表示后面有13个字节
F0 :读权限; F0 :写权限 ;AA:后续状态; 55 :错误计数,当前为 5次机会,返回错
误代码是 63 CX, X就是次数了,当X为0时卡永久补锁,操作主控密钥时请注
意!建立目录文件 DF
执行指令: 80E0 3F01 0D 38 0520 F0F0 95 FFFF 4444463031
说明: 80E0 :指令类别和指令码; 3F01 :文件标识; 0D:长度; 38 :文件类型
0520 :文件的空间大小 ; F0 :读权限; F0 :写权限 ;
4444463031 :文件名 DDF01 也就是ASCII码了建立 DF目录下密钥文件
执行指令: 80E0 0001 07 3F018F 95F0 FFFF
3F表示是密钥文件在 DF目录下密钥文件里增加口令密钥
执行指令: 80 D4 01 01 08 3A F0 EF 44 55 12 34 56
说明:
80D4 :指令类别和指令码;
0101 :文件标识;
08:长度;
3A:文件类型,即口令密 钥
F0 :读权限;
EF:写权限 ;
44 :后续状态;
55 :错误计数;
12 34 56 :3个字节的PIN 密码
9. 基本文件,建立二进制文件
执行指令: 80 E0 00 03 07 28 00 1E F0 F0 FF 02
说明:
80E0 :指令类别和指令码; 创建文件CreateFile
00 03 :文件标识;
07:长度; 数据域长度
28 :文件类型,即二进制文件
00 1E:空间大小,即为写入二进制文件的字节个数 ; 是文件的空间大小
F0 :读权限;
F0 :写权限 ;
注意:此处的读写权限都为F0,表示读跟写都没有限制,可随便读写,不用访问权 限
02表示写操作的时候,使用标示为01的密钥
执行指令: 80E0 00 04 07 28 00 0F F4 F0 FF 02
说明:
80 E0 :指令类别和指令码; 创建文件
00 04 :文件标识;
07:长度;
28 :文件类型,即二进制文件
00 0F:空间大小,即为写入二进制文件的字节个数 ;
F4 :读权限;
F0 :写权限 ;
注意:此处的读权限为
F4,表示读权限要大于或等于 4 的情况下才能读取,也就是 说要验证口令后才能读取,因为口令的后续状态为4 ;
而写呢,即可随便写,没有限 制
即安全状态值 0~F都可以写二制数据
- 写二进制文件,须先读出该文件所在目录下的标识,然后再给其写入
10.1:
执行指令:比如读取标识为 0003的,则:00A40000020003 返回9000 表示读取成功
然后写入你要写入内容,空间大小不能超过 1E字节(建立该文件时设定的)
执行写二进制的指令: 00D6 0000 05 0102030405
说明: 00D6 :指令类别和指令码; 0000 :偏移量,意思是指要读出的内容从该位置开始
05:长度LEN; 0102030405 : 就是你要写入的内容与前面的长度对应
执行指令:00A40000020004 返回 9000 表示读取当前标识的二进制文件成功
执行写二进制的指令: 00 D6 00 00 06 11 22 33 44 55 66
说明: 00D6 :指令类别和指令码; 0000 :偏移量,意思是指要读出的内容从该位置开始
06:长度LEN; 112233445566 : 就是你要写入的内容与前面的长度对应
11.读出二进制文件
00B0830000 读文件标识符为0003的文件,从偏移量0,开始读
- 验证口令
- PIN上面已设为123456
在当前目录下执行指令: 0020 0001 03 123456
说明: 0020 :指令类别和指令码; 0001:标识; 03:为密码个数字节为单位; 123456:密码
内容
关于对文件的访问必须在当前目录下才能访问,否则提示:找不到该文件
在当前目录下读写该文件时,如果设置有权限时,必须要通过口令或外部认证方可读写,否则
提示:安全状态不满足
操作密码时一定要注意,记得自己所设的密码, 63 CX, 这里的X就是还剩可用多少次了.