复旦微电子CPU卡发卡流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lupengfei1009/article/details/53002341

前言

近段时间一直在做CPU卡相关的应用,也知道简单的去操作CPU卡相关数据,但是并没有真正深入去了解CPU卡相关的东西;近期搜集了部分资料,并仔细阅读了pboc3.0规范复旦FM1208技术手册等相关文档,并在淘宝上淘了几张复旦的白卡,花了整整一周的时间,终于自己发了几张测试卡并成功进行了充值和消费操作,因此,分享一下研究的结果同时也算是做笔记了,便于日后查看及回顾。

指令列表

FMCOS指令列表见下图:

发卡

简单粗暴,直接上具体的发卡流程,因为具体的CPU卡相关的理论在理解上还是需要一段时间,不是我这里一两句话就能解释的清楚;根据个人的切身感受,最开始研究(入门)的时候更多的时候是需要知道到底该怎么做,然后回过头去看理论理解起来更快,因此这里直接上干货;想要更多的了解理论可以直接百度《PBOC3.0规范》看文档去。
发卡大的操作分为以下几个步骤:

  1. 传输认证(外部认证)
  2. 卡片擦除
  3. 目录文件及用户密钥的创建及写入
  4. 数据(二进制数据,记录数据)的写入

对于传输通道的认证,个人觉得最通俗的理解就是获取读写权限,允许对里面的信息进行增删改的操作;默认的传输密钥为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)

目录文件及用户密钥的创建及写入

这里主要包含了主文件的创建,密钥文件创建,二进制文件、记录文件的创建以及用户密钥的写入

扫描二维码关注公众号,回复: 4832345 查看本文章

命令报文数据域

  • 目录文件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

指令集说明

  • 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已经发完。

猜你喜欢

转载自blog.csdn.net/lupengfei1009/article/details/53002341