【转】CUP卡操作指令集


原文:https://www.zhihu.com/question/274490260/answer/379320811

指令列表如下:

 

发卡操作分为以下几个步骤:

  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)

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

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

 

命令报文数据域

 

  • 目录文件DF(包含MF)
    文件类型文件空间建立权限擦除权限应用文件ID保留字DF名称382字节1字节1字节XXFFFF5-16字节
  • 基本文件EF
    命令报文数据域文件类型BYTE1BYTE2-3BYTE4BYTE5BYTE6BYTE7二进制文件28文件空间读权限写权限FF见说明定长记录文件2A文件空间读权限写权限FF见说明循环文件2E文件空间读权限写权限FF见说明PBOC ED/EP2F0208使用权限保留(00)FF交易明细文件短标识变长记录文件2C文件空间读权限写全选FF见说明密钥文件3F文件空间DF文件短标识符中间权限FFFF
    • 如果希望使用明文 MAC 写 BYTE1 最高位需置 1 (“ 28 ”变为“ A8 ”)
      如果希望使用加密写,则BYTE1次的最高位置1(“28”变成“68”)
    • 基本文件 EF (密钥文件、 PBOC ED/EP 文件除外)的保留字的最后一个字节定义如下:(设该字节的为定义为 b8 ~ b1 )
      b8b7b6b5b4b3b2b1含义1-------文件不支持带线路保护读0-------文件必须使用线路保护读-111----保留为1----11--读操作时使用的密钥标识标识为00的密钥----10--标识为01的密钥----01--标识为02的密钥----00--标识为03的密钥------11写操作时使用的密钥标识标识为00的密钥------10标识为01的密钥------01标识为02的密钥------00标识为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圈存密钥

指令集列表

指令集说明

  • 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计算如下图:
 

数据(二进制数据,记录数据)的读出

使用二进制方式读取指定文件ID的0x30-0x60位置的共48个字节,并通过485透传。

假设数据写文件ID:0x15中,文件秘钥为(16进制):5A 31 58 52 41 36 46 52 5A 31 58 52 41 36 46 52

 具体流程参考:

  1、选择文件: 0x00, 0xA4, 0x00, 0x00, 0x02, 0x00, 0x15(文件ID)

  2、取随机数:0x00, 0x84, 0x00, 0x00, 0x08

    3、外部认证:0x00, 0x82, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

    红色部分为:使用文件秘钥做为KEY,对上一步获取到随机数进行3DES加密得到的8字节

      4、读取文件的48个字节的二进制数据

   0x00, 0xB0, 0x95((文件ID+0x80), 0x30(起始位置), 0x60(结束位置)


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

CPU卡常用的APDU指令错误码

9000 正常 成功执行
6200 警告 信息未提供
6281 警告 回送数据可能出错
6282 警告 文件长度小于Le
6283 警告 选中的文件无效
6284 警告 FCI格式与P2指定的不符
6300 警告 鉴别失败
63Cx 警告 校验失败(x-允许重试次数)
6400 出错 状态标志位没有变
6581 出错 内存失败
6700 出错 长度错误
6882 出错 不支持安全报文
6981 出错 命令与文件结构不相容,当前文件非所需文件
6982 出错 操作条件(AC)不满足,没有校验PIN
6983 出错 认证方法锁定,PIN被锁定
6984 出错 随机数无效,引用的数据无效
6985 出错 使用条件不满足
6986 出错 不满足命令执行条件(不允许的命令,INS有错)
6987 出错 MAC丢失
6988 出错 MAC不正确
698D 保留 
6A80 出错 数据域参数不正确
6A81 出错 功能不支持;创建不允许;目录无效;应用锁定
6A82 出错 该文件未找到
6A83 出错 该记录未找到
6A84 出错 文件预留空间不足
6A86 出错 P1或P2不正确
6A88 出错 引用数据未找到
6B00 出错 参数错误
6Cxx 出错 Le长度错误,实际长度是xx
6E00 出错 不支持的类:CLA有错
6F00 出错 数据无效
6D00 出错 不支持的指令代码
9301 出错 资金不足
9302 出错 MAC无效
9303 出错 应用被永久锁定
9401 出错 交易金额不足
9402 出错 交易计数器达到最大值
9403 出错 密钥索引不支持
9406 出错 所需MAC不可用
6900 出错 不能处理
6901 出错 命令不接受(无效状态)
61xx 正常 需发GET RESPONSE命令
6600 出错 接收通讯超时
6601 出错 接收字符奇偶错
6602 出错 校验和不对
6603 警告 当前DF文件无FCI
6604 警告 当前DF下无SF或KF
 
注:实际运用中也会有0x0000,0xFFFF指令返回,有时在选择一个文件时会返回0x0000,但也可以往后继续执行。
 
posted @ 2021-12-27 19:55  耿通宇  阅读(3279)  评论(0编辑  收藏  举报