原文:https://www.zhihu.com/question/274490260/answer/379320811
指令列表如下:
发卡操作分为以下几个步骤:
- 传输认证(外部认证)
- 卡片擦除
- 目录文件及用户密钥的创建及写入
- 数据(二进制数据,记录数据)的写入
对于传输通道的认证,个人觉得最通俗的理解就是获取读写权限,允许对里面的信息进行增删改的操作;默认的传输密钥为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圈存密钥
指令集列表
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计算如下图: