首页 > 代码库 > 社保系列5——基本指令

社保系列5——基本指令

本部分的指令是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?
  1. CPURESET()  
  2. 00A4000002DDF1  
  3. IRK=00000000000000000000000000000000//主内部认证密钥:00  
  4. 0084000008(RAM+9000)  
  5. ECB_3DES_EN(RAM,IRK,PROCESSK)//过程密钥  
  6. ECB_SDES_EN(0102030405060708,PROCESSK,AUTHD)//产生鉴别数据  
  7. 0088000010+RAM+0102030405060708   
  8. 0088000011+RAM+0102030405060708+01 //密钥版本号(如果有)  
  9. 00C0000008(AUTHD_+9000)  

If( AUTHD == AUTHD_) 校验成功,否则IRK错误。

 


2. PIN修改,解锁

 PIN CHANGE/UNLOCK命令为发卡者提供了修改PIN、重装PIN和解锁PIN的功能。重装后PIN文件的错误限制数恢复到建立时的初值。

 CHANGE PIN命令允许持卡人将当前个人密码修改为新的密码。


[cpp] view plaincopyprint?
  1. //个人PIN码解锁,修改,首先需要认证PUK,然后用STK计算过程密钥进行解锁,修改  
  2. CPURESET()  
  3. 00A4000002DDF1  
  4. //认证PUK  
  5. PUK=00000000012430000000000888011100  
  6. 0084000008(RAMD+9000)  
  7. ECB_3DES_EN(RAMD,PUK,ENDATA)  
  8. ECB_SDES_EN(0102030405060708,ENDATA,ENDATA1)  
  9. 0082000610+ENDATA1+0102030405060708 //标识:06  
  10.    
  11. //修改PIN  
  12. 0084000008(RAMDOM+9000)  
  13. STK=0002200001243000 //PIN信息中STK-KID指向密钥STK  
  14. ECB_SDES_EN(RAMDOM,STK,SESSIONK) //产生过程密钥  
  15. ECB_SDES_EN(03888888+80000000,SESSIONK,ENCDATA)//计算密文  
  16. 3DES_MAC(0000000000000000+842400010C+ENCDATA+800000,SESSIONK,MAC)  
  17. 842400010C+ENCDATA+MAC(9000) //P2:01更改PIN,尝试计数器重置,同时修改PIN  
  18. //认证PIN  
  19. 0020000003888888  
  20.    
  21. //解锁PIN  
  22. ECB_SDES_EN(RAMDOM,STK,SESSIONK) //产生过程密钥  
  23. 3DES_MAC(0000000000000000+8424000004+800000,SESSIONK,MAC)  
  24. 8424000004+MAC(9000) //P2:00解锁PIN,尝试计数器重置,但不修改PIN  
  25.    
  26. //CHANGE PIN  
  27. 00A4000002DDF1  
  28. 805E010007+888888FF123456  //当前PIN ||FF|| 新的PIN  
  29. //认证PIN  
  30. 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?
  1. //首先认证LK,然后用STK计算过程密钥计算MAC  
  2. 00A4000002DDF1  
  3. 00A4000002DF04  
  4. //认证LK,BK   
  5. LK=00000000000000000000000000000000  
  6. 0084000008(RAM+9000)  
  7. ECB_3DES_EN(RAM,LK,ENDATA)  
  8. ECB_SDES_EN(0102030405060708,ENDATA,ENDATA1)  
  9. 0082008310+ENDATA1+0102030405060708(9000)// 标志03  
  10. //用STK锁应用  
  11. STK=0000000000000000  
  12. 0084000008(RAMD+9000)  
  13. ECB_SDES_EN(RAMD,STK,SSK)  
  14. 3DES_MAC(0000000000000000+841E000104+800000,SSK,MAC)  
  15. 841E000104+MAC //8416000104(BK)  



4. 外部认证

EXTERNAL AUTHENTICATE命令的目的是IC卡验证外部接口设备的有效性,使接口设备对IC卡获得某种操作授权。

例如:更新文件信息UK(UPDATAKEY),读取文件信息RK(READKEY)

[cpp] view plaincopyprint?
  1. 0084000008(RAM+9000)  
  2. ECB_3DES_EN(RAM,00000000000000000000000000000000,ENDATA)  
  3. ECB_SDES_EN(0102030405060708,ENDATA,ENDATA)  
  4. 0082000111+ENDATA+0102030405060708+VERSION(9000)  
  5. P2:  
  6. 0  x  x x  x  x  x  x  全局密钥标识(认证MF或DDF下的密钥)  
  7. 1  x  x x  x  x  x  x  局部密钥标识 (ADF下的密钥)  
  8. 0  0  0 0  0  0  0  0  当前DF下的MK  
  9. Lc:  
  10. 金融环境:08  
  11. 社保环境:10,11,00(检验P2参数所指密钥是否存在(6A88[NO]),计数器当前的值(63Cx))  
  12.    


5. 读写记录文件

READ RECORD(00B2或04B2)命令读记录文件中指定的记录。

UPDATE RECORD(00DC或04DC)命令用给定的数据代替记录文件中指定的纪录。


[cpp] view plaincopyprint?
  1. CPURESET()  
  2. 00A4000002DDF1  
  3. 00A4000002DF04  
  4. 00A4000002EF05  
  5. 0084000008(RAM+9000) //满足读权限  
  6. ECB_3DES_EN(RAM,88657368201020122336060719830728,ENDATA) ECB_3DES_EN(0102030405060708,ENDATA,ENDATA)  
  7. 0082008510+ENDATA+0102030405060708(9000)  
  8. //读记录 01(第一条记录)+04(P1记录号)+01(期望返回值长度)  
  9. 00B2+01+04+03 //满足写权限  
  10. 0084000008(RAM+9000)  
  11. ECB_3DES_EN(RAM,88657368201020122336060719830728,ENDATA) ECB_SDES_EN(0102030405060708,ENDATA,ENDATA) 0082008811+ENDATA+0102030405060708+01(9000)  
  12.  //更新记录 01(第一条记录)+04(P1记录号)+03(更新记录的长度,必须和之前写的长度一致,如果之前未写入数据,可以任意更新)  
  13.  00DC010403+C1011


文/闫鑫原创   转载请注明出处http://blog.csdn.net/yxstars/article/details/38389289