前言
指令列表
发卡
卡片擦除
目录文件及用户密钥的创建及写入
命令报文数据域
指令集列表
指令集说明
数据(二进制数据,记录数据)的写入
MF下05文件写入
EF下15文件写入
前言
近段时间一直在做CPU卡相关的应用,也知道简单的去操作CPU卡相关数据,但是并没有真正深入去了解CPU卡相关的东西;近期搜集了部分资料,并仔细阅读了pboc3.0规范及复旦FM1208技术手册等相关文档,并在淘宝上淘了几张复旦的白卡,花了整整一周的时间,终于自己发了几张测试卡并成功进行了充值和消费操作,因此,分享一下研究的结果同时也算是做笔记了,便于日后查看及回顾。
指令列表
FMCOS指令列表见下图:
发卡
简单粗暴,直接上具体的发卡流程,因为具体的CPU卡相关的理论在理解上还是需要一段时间,不是我这里一两句话就能解释的清楚;根据个人的切身感受,最开始研究(入门)的时候更多的时候是需要知道到底该怎么做,然后回过头去看理论理解起来更快,因此这里直接上干货;想要更多的了解理论可以直接百度《PBOC3.0规范》看文档去。
发卡大的操作分为以下几个步骤:
传输认证(外部认证)
卡片擦除
目录文件及用户密钥的创建及写入
数据(二进制数据,记录数据)的写入
对于传输通道的认证,个人觉得最通俗的理解就是获取读写权限,允许对里面的信息进行增删改的操作;默认的传输密钥为8个字节的0xFF,即:FFFFFFFFFFFFFFFF
卡片上电复位
个人前端是使用的手机NFC进行卡片操作,因此将卡片贴到手机NFC感应区域即已经上电复位,建立卡片连接之后即可进行下一步的操作。
获取随机数
发送指令:0084000008(得到8个字节的随机数)
指令回复:53fd1f262ec4e6e29000(得到随机数:53fd1f262ec4e6e2)
指令说明:00(CLA)84(INS)00(P1)00(P2)08(Le)
对随机数进行DES加密
加密数据:53fd1f262ec4e6e2
加密密钥:FFFFFFFFFFFFFFFF(外部认证密钥)
处理结果:A0DBBFC1192FF24A
传输认证(外部认证)
发送指令:0082000008A0DBBFC1192FF24A(Data部分为前一步的DES处理的结果)
指令回复:9000(认证成功)
指令说明:00(CLA)82(INS)00(P1)00(P2外部认证密钥标识00/01)08(Lc)A0DBBFC1192FF24A(Data 8个字节加密后的随机数)
可能存在的错误回复:
6188
认证密钥不存在,可能是已经做了传输认证并已经擦除的卡片,可以直接尝试一下擦除卡片看是否成功,如果成功,即可做后续的动作。
63Cx
认证失败,x为允许再次尝试的次数;出现此错误原因可能有2个,一个是密钥错误;另一个是DES加密出现错误;
外部认证方式不同的厂商的卡认证方式可能会存在区别,比如在淘宝淘卡的时候会明确的说他这种卡的认证方式。
卡片擦除
擦除卡片里面的所有数据,擦除成功之后,卡片即成为一张空白卡片
发送指令:800E000000
指令回复:9000(擦除成功)
指令说明:80(CLA)0E(INS)00(P1)00(P2)00(Lc)
目录文件及用户密钥的创建及写入
这里主要包含了主文件的创建,密钥文件创建,二进制文件、记录文件的创建以及用户密钥的写入
命令报文数据域
目录文件DF(包含MF)
文件类型 文件空间 建立权限 擦除权限 应用文件ID 保留字 DF名称
38 2字节 1字节 1字节 XX FFFF 5-16字节
基本文件EF
命令报文数据域
文件类型 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
如果希望使用明文 MAC 写 BYTE1 最高位需置 1 (“ 28 ”变为“ A8 ”)
如果希望使用加密写,则BYTE1次的最高位置1(“28”变成“68”)
基本文件 EF (密钥文件、 PBOC ED/EP 文件除外)的保留字的最后一个字节定义如下:(设该字节的为定义为 b8 ~ b1 )
b8 b7 b6 b5 b4 b3 b2 b1 含义
1 - - - - - - - 文件不支持带线路保护读
0 - - - - - - - 文件必须使用线路保护读
- 1 1 1 - - - - 保留为1
- - - - 1 1 - - 读操作时使用的密钥标识 标识为00的密钥
- - - - 1 0 - - 标识为01的密钥
- - - - 0 1 - - 标识为02的密钥
- - - - 0 0 - - 标识为03的密钥
- - - - - - 1 1 写操作时使用的密钥标识 标识为00的密钥
- - - - - - 1 0 标识为01的密钥
- - - - - - 0 1 标识为02的密钥
- - - - - - 0 0 标识为03的密钥
对于记录文件(包括定长文件、钱包文件、循环文件),文件空间的第一个字节为记录的总个数,第二个字节为记录的长度:物理空间总数(个数*(记录长度+1)+8)。
对于对于密钥文件所谓的DF短文件标识符,说明如下:当高三位为000时为DDF,当高三位是100时是ADF短文件标识号。
对于 PBOC ED/EP 中所谓的 TAC 密钥标识是指该 ED/EP 在计算 TAC 时使用到的密钥类型为‘ 34 ’密钥的标识;所谓交易明细文件是指 ED/EP 在记录交易明细时用到的短文件标识符。
所有文件建立之后不能自动被选择。
密钥类型
类型 意义
34 内部密钥
36 文件线路保护密钥
38 重装口令密钥的密钥
39 外部认证密钥
3A 口令密钥
3B 解锁口令密钥
3C 修改透支限额
3D 圈提
3E 消费
3F 圈存密钥
指令集列表
800E000000
80E03F000D38FFFFF0F001FFFFFFFFFFFFFF
80E00000073F005001F0FFFF
80D401000D36F0F0FF33FFFFFFFFFFFFFFFF
80D401001539F0F0AA33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
80E00001072A0213F000FFFF
80E0000507A80030F0F0FFFF
00E200081361114F09A00000000386980701500450424F43
80E03F011138036FF0F095FFFFA00000000386980701
00A4040009A00000000386980701
80E00000073F018F95F0FFFF
80D401001534F002000134343434343434343434343434343434
80D401001536F002FF3336363636363636363636363636363636
80D401001537F002FF3337373737373737373737373737373737
80D401001538F002FF3338383838383838383838383838383838
80D401001539F002443339393939393939393939393939393939
80D40101153EF00200013E013E013E013E013E013E013E013E01
80D40102153EF00200013E023E023E023E023E023E023E023E02
80D40101153FF00200013F013F013F013F013F013F013F013F01
80D40102153FF00200013F023F023F023F023F023F023F023F02
80D40101153DF00201003D013D013D013D013D013D013D013D01
80D40102153DF00201003D023D023D023D023D023D023D023D02
80D40101153CF00201003C013C013C013C013C013C013C013C01
80D40102153CF00201003C023C023C023C023C023C023C023C02
80D401000D3AF0EF013312345FFFFFFFFFFF
80E0001507A8001EF0F0FFFF
80E0001607A80027F0F0FFFF
80E00017072805DCF0F0FFFF
80E00018072E0A17F0EFFFFF
80E00001072F0208F100FF18
80E00002072F0208F000FF18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
指令集说明
MF文件的创建
发送指令:80E03F000D38FFFFF0F001FFFFFFFFFFFFFF
指令回复:9000(文件创建成功)
指令说明:80(CLA)E0(INS)3F00(P1 P2 文件标识)0D(Lc)38(文件类型)FFFF(文件空间)F0(建立权限)F0(擦除权限)01(应用文件ID)FFFF(保留字)FFFFFFFFFF(DF名称)
建立密钥文件
发送指令:80E00000073F005001F0FFFF
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)0000(P1P2文件标识)07(Lc)3F(文件类型)0050(文件空间)01(DF文件短标识符)F0(增加权限)FF(默认)FF(默认)
添加线路保护密钥
发送指令:80D401000D36F0F0FF33FFFFFFFFFFFFFFFF
指令回复:9000(成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)0D(Lc)36(密钥标识)F0(使用权)F0(更改权)FF(默认)33(错误计数器)FFFFFFFFFFFFFFFF(密钥)
添加外部认证密钥
发送指令:80D401001539F0F0AA33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
指令回复:9000(成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)39(密钥标识)F0(使用权)F0(更改权)AA(后续状态)33(错误计数器)FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(密钥)
创建定长文件
发送指令:80E00001072A0213F000FFFF
指令回复:9000(成功)
指令说明:80(CLA)E0(INS)0001(P1P2文件标识)07(Lc)2A(定长文件)0213(文件空间)F0(读权限)00(写权限)FF(默认)FF(默认)
创建05文件
发送指令:80E0000507A80030F0F0FFFF
指令回复:9000(成功)
指令说明:80(CLA)E0(INS)0005(P1P2文件标识)07(Lc)A8(二进制文件28–>A8)0030(文件空间)F0(读权限)F0(写权限)FF(默认)FF(默认)
注:28–>A8 28=00101000 高位变1即:10101000=A8(明文+MAC校验)
添加文件记录
发送指令:00E200081361114F09A00000000386980701500450424F43
指令回复:9000(添加成功)
创建EF(基本文件)
发送指令:80E03F011138036FF0F095FFFFA00000000386980701
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)3F01(P1 P2文件标识)11(Lc)38(文件类型(目录文件))036F(文件空间)F0(建立权限)F0(擦除权限)95(应用文件标识)FFFF(保留字段)A00000000386980701(DF名称 AID)
选择EF
发送指令:00A4040009A00000000386980701
指令回复:6f0b8409a000000003869807019000(成功选中)
指令说明:00(CLA)A4(INS)04(P1)00(P2)09(Lc)A00000000386980701(Data AID)
回复说明:6f(文件控制信息板块的记录标识)0b(长度)84(DF名称的记录标识)09(DF名称记录数据长度)a00000000386980701(ADF的名称)9000(SW1 SW2)
建立密钥文件
发送指令:80E00000073F018F95F0FFFF
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)0000(P1P2 文件标识)07(Lc)3F(文件类型)018F(文件控件)95(DF文件短标识符)F0(增加权限)FF(默认)FF(默认)
添加内部密钥
发送指令:80D401001534F002000134343434343434343434343434343434
指令回复:9000(创建成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)34(密钥标识)F0(使用权)02(更改权)00(密钥版本号)01(算法标识)34343434343434343434343434343434(密钥)
添加线路保护密钥(这里的线路密钥和前面那个所保护的文件不同)
发送指令:80D401001536F002FF3336363636363636363636363636363636
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)36(密钥标识)F0(使用权)02(更改权)FF(默认FF)33(错误计数器)36363636363636363636363636363636(密钥)
添加口令解锁密钥
发送指令:80D401001537F002FF3337373737373737373737373737373737
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)37(密钥标识)F0(使用权)02(更改权)FF(默认FF)33(错误计数器)37373737373737373737373737373737(密钥)
添加口令重装密钥
发送指令:80D401001538F002FF3338383838383838383838383838383838
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)38(密钥标识)F0(使用权)02(更改权)FF(默认FF)33(错误计数器)38383838383838383838383838383838(密钥)
外部认证密钥
发送指令:80D401001539F002443339393939393939393939393939393939
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)39(密钥标识)F0(使用权)02(更改权)44(后续状态)33(错误计数器)39393939393939393939393939393939(密钥)
消费密钥01
发送指令:80D40101153EF00200013E013E013E013E013E013E013E013E01
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3E(密钥标识)F0(使用权)02(更改权)00(密钥版本号)01(算法标识)3E013E013E013E013E013E013E013E01(密钥)
消费密钥02
发送指令:80D40102153EF00200013E023E023E023E023E023E023E023E02
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)02(P2)15(Lc)3E(密钥标识)F0(使用权)02(更改权)00(密钥版本号)01(算法标识)3E023E023E023E023E023E023E023E02(密钥)
圈存密钥01
发送指令:80D40101153FF00200013F013F013F013F013F013F013F013F01
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3F(密钥标识)F0(使用权)02(更改权)00(密钥版本号)01(算法标识)3F013F013F013F013F013F013F013F01(密钥)
圈存密钥02
发送指令:80D40102153FF00200013F023F023F023F023F023F023F023F02
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3F(密钥标识)F0(使用权)02(更改权)00(密钥版本号)01(算法标识)3F023F023F023F023F023F023F023F02(密钥)
圈提密钥01
发送指令:80D40101153DF00201003D013D013D013D013D013D013D013D01
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3D(密钥标识)F0(使用权)02(更改权)01(密钥版本号)00(算法标识)3D013D013D013D013D013D013D013D01(密钥)
圈提密钥02
发送指令:80D40102153DF00201003D023D023D023D023D023D023D023D02
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3D(密钥标识)F0(使用权)02(更改权)01(密钥版本号)00(算法标识)3D023D023D023D023D023D023D023D02(密钥)
添加修改透支限额密钥01
发送指令:80D40101153CF00201003C013C013C013C013C013C013C013C01
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3C(密钥标识)F0(使用权)02(更改权)01(密钥版本号)00(算法标识)3C013C013C013C013C013C013C013C01(密钥)
添加修改透支限额密钥02
发送指令:80D40102153CF00201003C023C023C023C023C023C023C023C02
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3C(密钥标识)F0(使用权)02(更改权)01(密钥版本号)00(算法标识)3C023C023C023C023C023C023C023C02(密钥)
添加口令(PIN)
发送指令:80D401000D3AF0EF013312345FFFFFFFFFFF
指令回复:9000(添加成功)
指令说明:80(CLA)D4(INS)01(P1)00(P2)0D(Lc)3A(口令密钥)F0(使用权)EF(默认EF)01(后续状态)33(错误计数器)12345FFFFFFFFFFF(口令)
创建15号文件(二进制文件)
发送指令:80E0001507A8001EF0F0FFFF
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)0015(P1 P2 文件标识)07(Lc)A8(明文MAC 28(二进制文件高位变1)–>A8)001E(文件空间)F0(读权限)F0(增加权限)FF(默认FF)FF(默认FF)
注:28–>A8 28=00101000 高位变1即:10101000=A8(明文+MAC校验)
创建17号文件(二进制文件)
发送指令:80E00017072805DCF0F0FFFF
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)0017(P1 P2 文件标识)07(Lc)28(二进制文件)05DC(文件空间)F0(读权限)F0(添加权限)FF(默认FF)FF(默认FF)
创建18号文件(循环文件)
发送指令:80E00018072E0A17F0EFFFFF
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)0018(P1 P2 文件标识)07(Lc)2E(循环文件)0A17(文件空间)F0(读权限)EF(增加权限)FF(默认FF)FF(默认FF)
创建钱包文件(电子存折)
发送指令:80E00001072F0208F100FF18
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)0001(P1 P2 文件标识)07(Lc)2F(PBOC ED/EP)0208(默认0208)F1(使用权)00(保留00)FF(默认FF)18(交易明细文件短标识)
创建钱包文件(电子钱包)
发送指令:80E00002072F0208F000FF18
指令回复:9000(创建成功)
指令说明:80(CLA)E0(INS)0002(P1 P2 文件标识)07(Lc)2F(PBOC ED/EP)0208(默认0208)F0(使用权)00(保留00)FF(默认FF)18(交易明细文件短标识)
数据(二进制数据,记录数据)的写入
MF下05文件写入
选择MF
发送指令:00A40000023F00
指令回复:6f15840e315041592e5359532e4444463031a5038801019000
取随机数
发送指令:0084000004
指令回复:88bbe4e39000
通过写入数据计算MAC
计算MAC方式可以通过百度搜索PBOC MAC计算工具
数据源:04D6850034000122000001FFFF22000000000000060001201610280000000000010001000000000000000000000000000020501231
初始向量:88bbe4e300000000(随机数+00000000)
密钥:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(各自文件下的线路保护密钥)
计算结果:AE8D8774
发送指令:04D6850034000122000001FFFF22000000000000060001201610280000000000010001000000000000000000000000000020501231AE8D8774(指令+MAC)
指令回复:9000(添加成功)
指令说明:04(CLA)D6(INS)85(文件标识)00(写入数据偏移量)34(Lc Data+MAC)000122000001FFFF22000000000000060001201610280000000000010001000000000000000000000000000020501231(Data 根据情况写入,可以随意定义)AE8D8774(MAC)
MAC计算如下图:
EF下15文件写入
选择MF
发送指令:00A40000023F00
指令回复:6f15840e315041592e5359532e4444463031a5038801019000
选择EF
发送指令:00A4040009A00000000386980701
指令回复:6f328409a00000000386980701a5259f0801029f0c1e0000000000000000000000000000000000000000000000000000000000009000
取随机数
发送指令:0084000004
指令回复:a3bbcfc89000
通过写入数据计算MAC
计算MAC方式可以通过百度搜索PBOC MAC计算工具
数据源:04D6950022000122000001FFFF01010000220000000000000620160101205012310000
初始向量:a3bbcfc800000000(随机数+00000000)
密钥:36363636363636363636363636363636(各自文件下的线路保护密钥)
计算结果:96E32EF1
发送指令:04D6950022000122000001FFFF0101000022000000000000062016010120501231000096E32EF1(指令+MAC)
指令回复:9000(添加成功)
指令说明:04(CLA)D6(INS)95(文件标识)00(写入数据偏移量)22(Lc Date+Mac)000122000001FFFF01010000220000000000000620160101205012310000(Data 根据情况写入,可以随意定义)96E32EF1(MAC)
MAC计算如下图:
到此,一张能正常充值和消费的CPU已经发完。
---------------------
作者:lupengfei1009
来源:CSDN
原文:https://blog.csdn.net/lupengfei1009/article/details/53002341
版权声明:本文为博主原创文章,转载请附上博文链接!