本部分的指令是ISO/IEC 7816定义的基本指令,包括:
? APPLICATION BLOCK(应用锁定)
? CARD BLOCK(卡片锁定)
? CHANGE PIN(修改个人密码)
? EXTERNAL AUTHENTICATION(外部鉴别)
? GET RESPONSE(获取响应)
? GET CHALLENGE(获取随机数)
? INTERNAL AUTHENTICATION(内部鉴别)
? PIN CHANGE/UNBLOCK(个人密码修改/解锁)
? READ BINARY(读取二进制数据)
? READ RECORD(读取记录内容)
? SELECT(选择文件)
? UPDATE BINARY(更新二进制数据)
? UPDATE RECORD(更新记录内容)
? VERIFY(校验个人密码)
1. 内部认证
INTERNALAUTHENTICATE 命令要求卡向接口设备提供认证数据,以使接口设备对卡进行认证。
用途:使用IRK对发卡方进行验证,IC卡有效性检查
随机数1(终端)||随机数2(终端)||密钥版本号(如果有)
[cpp] view
plaincopyprint?
- CPURESET()
- 00A4000002DDF1
- IRK=00000000000000000000000000000000//主内部认证密钥:00
- 0084000008(RAM+9000)
- ECB_3DES_EN(RAM,IRK,PROCESSK)//过程密钥
- ECB_SDES_EN(0102030405060708,PROCESSK,AUTHD)//产生鉴别数据
- 0088000010+RAM+0102030405060708
- 0088000011+RAM+0102030405060708+01 //密钥版本号(如果有)
- 00C0000008(AUTHD_+9000)
If( AUTHD == AUTHD_) 校验成功,否则IRK错误。
2. PIN修改,解锁
PIN CHANGE/UNLOCK命令为发卡者提供了修改PIN、重装PIN和解锁PIN的功能。重装后PIN文件的错误限制数恢复到建立时的初值。
CHANGE PIN命令允许持卡人将当前个人密码修改为新的密码。
[cpp] view
plaincopyprint?
- //个人PIN码解锁,修改,首先需要认证PUK,然后用STK计算过程密钥进行解锁,修改
- CPURESET()
- 00A4000002DDF1
- //认证PUK
- PUK=00000000012430000000000888011100
- 0084000008(RAMD+9000)
- ECB_3DES_EN(RAMD,PUK,ENDATA)
- ECB_SDES_EN(0102030405060708,ENDATA,ENDATA1)
- 0082000610+ENDATA1+0102030405060708 //标识:06
- //修改PIN
- 0084000008(RAMDOM+9000)
- STK=0002200001243000 //PIN信息中STK-KID指向密钥STK
- ECB_SDES_EN(RAMDOM,STK,SESSIONK) //产生过程密钥
- ECB_SDES_EN(03888888+80000000,SESSIONK,ENCDATA)//计算密文
- 3DES_MAC(0000000000000000+842400010C+ENCDATA+800000,SESSIONK,MAC)
- 842400010C+ENCDATA+MAC(9000) //P2:01更改PIN,尝试计数器重置,同时修改PIN
- //认证PIN
- 0020000003888888
- //解锁PIN
- ECB_SDES_EN(RAMDOM,STK,SESSIONK) //产生过程密钥
- 3DES_MAC(0000000000000000+8424000004+800000,SESSIONK,MAC)
- 8424000004+MAC(9000) //P2:00解锁PIN,尝试计数器重置,但不修改PIN
- //CHANGE PIN
- 00A4000002DDF1
- 805E010007+888888FF123456 //当前PIN ||FF|| 新的PIN
- //认证PIN
- 0020000003888888
3. 应用锁定
APPLICATION BLOCK命令使当前被选择的应用失效。失效后的应用仍可以选择(选择后返回SW1_SW2_6A81),但是该应用下的文件则是不可访问的,任何试图的访问都将返回SW1SW2=6A81。对失效的应用在返回6A81后,仍然可以用GetResponse命令来得到应用的FCI信息。对永久锁定的应用返回9303。
注:如果BL-KID为00h,则使用主控密钥(用途为00h)验算MAC;如果BL-KID不为00h,则使用传输密钥(用途为01h)验算MAC。
例如:80E0000213DF0205DB000000000039000208D15600000501(9000)BL-KID:用途01,标识02------->STK
STK:100102010100DD0000Access-Right:DD
LK,BK:1800030100000003DD SSB:DD
CARD BLOCK命令后,卡被锁定,除GET INFO命令外,卡拒绝执行任何命令,返回状态信息?6A81
[cpp] view
plaincopyprint?
- //首先认证LK,然后用STK计算过程密钥计算MAC
- 00A4000002DDF1
- 00A4000002DF04
- //认证LK,BK
- LK=00000000000000000000000000000000
- 0084000008(RAM+9000)
- ECB_3DES_EN(RAM,LK,ENDATA)
- ECB_SDES_EN(0102030405060708,ENDATA,ENDATA1)
- 0082008310+ENDATA1+0102030405060708(9000)// 标志03
- //用STK锁应用
- STK=0000000000000000
- 0084000008(RAMD+9000)
- ECB_SDES_EN(RAMD,STK,SSK)
- 3DES_MAC(0000000000000000+841E000104+800000,SSK,MAC)
- 841E000104+MAC //8416000104(BK)
4. 外部认证
EXTERNAL AUTHENTICATE命令的目的是IC卡验证外部接口设备的有效性,使接口设备对IC卡获得某种操作授权。
例如:更新文件信息UK(UPDATAKEY),读取文件信息RK(READKEY)
[cpp] view
plaincopyprint?
- 0084000008(RAM+9000)
- ECB_3DES_EN(RAM,00000000000000000000000000000000,ENDATA)
- ECB_SDES_EN(0102030405060708,ENDATA,ENDATA)
- 0082000111+ENDATA+0102030405060708+VERSION(9000)
- P2:
- 0 x x x x x x x 全局密钥标识(认证MF或DDF下的密钥)
- 1 x x x x x x x 局部密钥标识 (ADF下的密钥)
- 0 0 0 0 0 0 0 0 当前DF下的MK
- Lc:
- 金融环境:08
- 社保环境:10,11,00(检验P2参数所指密钥是否存在(6A88[NO]),计数器当前的值(63Cx))
5. 读写记录文件
READ RECORD(00B2或04B2)命令读记录文件中指定的记录。
UPDATE RECORD(00DC或04DC)命令用给定的数据代替记录文件中指定的纪录。
[cpp] view
plaincopyprint?
- CPURESET()
- 00A4000002DDF1
- 00A4000002DF04
- 00A4000002EF05
- 0084000008(RAM+9000) //满足读权限
- ECB_3DES_EN(RAM,88657368201020122336060719830728,ENDATA) ECB_3DES_EN(0102030405060708,ENDATA,ENDATA)
- 0082008510+ENDATA+0102030405060708(9000)
- //读记录 01(第一条记录)+04(P1记录号)+01(期望返回值长度)
- 00B2+01+04+03 //满足写权限
- 0084000008(RAM+9000)
- ECB_3DES_EN(RAM,88657368201020122336060719830728,ENDATA) ECB_SDES_EN(0102030405060708,ENDATA,ENDATA) 0082008811+ENDATA+0102030405060708+01(9000)
- //更新记录 01(第一条记录)+04(P1记录号)+03(更新记录的长度,必须和之前写的长度一致,如果之前未写入数据,可以任意更新)
- 00DC010403+C1011
文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38389289
社保系列5——基本指令