终端发送SELECT命令给卡片,获取卡片支持的应用信息。这些信息由发卡行设定,包括应用优先权、应用名称和首选语言等。命令数据中可以包含PSE名(使用目录选择方法)、DDF名或请求的AID(AID列表选择方法)
//选择PSE文件 Send:00A404000E315041592E5359532E4444463031 --->:611C Send:00C000001C //选择PSE后回送的FCI: 6F(FCI模板)+84(DF名)+A5(FCI数据专用模板)+88(目录基本文件的SFI)+5F2D(语言选择,O)+9F11(发卡行代码表索引,O)+BF0C(发卡行自定义数据,O) //IC卡返回:PSE9102 //如果选择失败,终端则直接改用AID列表选择方法 --->:6F1A+840E315041592E5359532E4444463031+A508+880101+5F2D027A689000 //根据88(目录基本文件的SFI,01),读取基本数据0001文件的第一条: Send:00B2010C00 --->:6C1D Send:00B2010C1D //IC卡返回:PSE0101 --->:701B6119+4F08A000000333010101+500A50424F43204445424954+8701019000 //读取基本数据0001文件的第二条,返回6A83(未找到记录),说明0001文件下只有一条记录(每条记录列出一个应用) Send:00B2020C00 --->:6A83 //选择标准借贷记文件 Send:00A4040008A000000333010101 --->:6147 Send:00C0000047 //选择借贷记应用后回送的FCI:6F(FCI模板)+84(DF名)+A5(FCI数据专用模板)+50(应用标签,O)+87(应用优先指示符,O)+9F38(PDOL数据对象列表,O)+5F2D(语言选择,O)+9F11(发卡行代码表索引,O)+9F12(应用优先名称,O)+BF0C(发卡行自定义数据,O) //IC卡返回:PSE9102 --->:6F45+8408A000000333010101+A539+500A50424F43204445424954+870101+9F38099F7A019F02065F2A02+5F2D027A68+9F110101+9F120A50424F43204445424954+BF0C059F4D020B0A9000
终端发送到卡的GETPROCESSING OPTIONS命令包括PDOL指定的所有终端数据元。如果卡片支持PDOL,则应用选择时PDOL会被包含在SELECT响应里。如果卡片不允许执行所选择的应用,终端就退出当前应用处理,并返回应用选择过程再选择另一个应用。
//获取处理选项GPO:用来启动IC卡内的交易 //根据9F38(PDOL)的值,来拼装数据,如下: //9F7A01:电子现金终端支持指示器,00(不支持电子现金处理) //9F0206:授权金额,000000000001 //5F2A02:货币代码,0156 Send:80A800000B+8309000000000001000156 --->:6114 //GPO返回:80(Tag,接触)+应用交互特征(AIP)+应用文件定位器(AFL) //7C(SDA+DDA+支持持卡人认证+支持终端风险管理+支持发卡行认证)+00 //根据GPO返回的AFL,从卡中读取数据 Send:00C0000014 --->:8012+7C00+08010200+10010401+20010300+280101009000
终端通过AFL决定要从卡片中读取哪些交易数据记录,每个AFL项(四个字节)代表了卡片一个文件中的连续记录。对每个AFL项(四个字节),从第1条记录开始,终端依次对每条记录向卡片发送一个读记录(READRECORD)命令读取记录数据,一直到最后一条记录。如此将所有AFL项处理完。读到的交易数据中可以识别的应存储在终端上供交易使用。如果读取到终端无法理解的数据,将其忽略。对于AFL指明要用于脱机数据认证的记录,则将其数据加到脱机认证的数据列表中供脱机数据认证使用。
AFL=08010200+10010401+20010300+28010100 08010200//0101~0102 10010401//0201~0104, SDA:0201 20010300//0401~0103 28010100//0501 //静态认证数据列表 = DGI0201 + TagValue["82"] SDA_Value =5A0A6230360501000269314F5F3401008E0C000000000000000002031F009F0D05D86004A8009F0E0500109800009F0F05D86804F8005F24032412315F280201569F0702FF005F25031512137C00
终端支持:非对称加密算法和哈希算法;至少支持六组认证中心公钥,公钥长度最大可至1984位;
SDA:验证卡内数据的正确性
DDA:验证卡内数据的正确性及卡的合法性
CDA:将动态数据认证(DDA)和应用密文生成结合起来,提供对卡内数据、卡片本身和交易安全的认证
在一个交易中,最多只执行一种脱机数据认证方法
1) 由终端恢复认证中心公钥。
2) 由终端恢复发卡行公钥。
3) 由终端验证签名的静态应用数据。
//CA公钥索引 (8F) —— 由终端恢复发卡行的公钥对 CA_E, CA_N //认证中心公钥指数必须等于3或2^16+1 CA_E = 03 //认证中心公钥模 CA_N =EB374DFC5A96B71D2863875EDA2EAFB96B1B439D3ECE0B1826A2672EEEFA7990286776F8BD989A15141A75C384DFC14FEF9243AAB32707659BE9E4797A247C2F0B6D99372F384AF62FE23BC54BCDC57A9ACD1D5585C303F201EF4E8B806AFB809DB1A3DB1CD112AC884F164A67B99C7D6E5A8A6DF1D3CAE6D7ED3D5BE725B2DE4ADE23FA679BF4EB15A93D8A6E29C7FFA1A70DE2E54F593D908A3BF9EBBD760BBFDC8DB8B54497E6C5BE0E4A4DAC29E5 //发卡行公钥证书(90) CA_I =BED0C8FBB87D9ACDA831A02211E67ECC25BFEAD3D39FE625722CAC62BD1C35DC8D736B9096F2038B98A061372390B853FCC2A3CF63A87C8861973ECFFA3E3312E40092FA9B0F7909FE18B9E1F199E029436FCD1ABC8A9D310AFF63470AD3A454A7CBC2150E97C516001157D95B51CE72CFB01E3EC443F62C4A76C5CAB5D6E04738DDC3273939BCD556DEA6A9D8DBE4D534D504FB980146A3C58271BB883ECA0D077E0119D3193DE2E70D47D4128B21EB //终端恢复发卡行公钥 //CA_O = DeRSA(CA_N, CA_E, CA_I) CA_O =6A02623036FF12300009870101B001D5C5C2BFE845E14E75681F83973E1E4F9543E7FCCA49D13D82E35CD2F5B6CBDC5005CA3A7B8E92B52443AECE23C2D1BB57F76D43D0D9A339AFB4BE186CB82515EDCD9B6278BF42B31083944FC524412580680824E0A0F2FC5F41A969FC0F19B67F9054D41FF0D7D0600C8E1E51AA80B4EDBEA34411403B497A3D4C2E47BB77442F584ABF26D618B28374543D84182929FB4D1C5D5E92597CE8DB56D552F2E4F3BC //组织摘要输入信息 + 发卡行公钥余项(如果有) + 发卡行公钥指数 //HashValueInfo = CA_O.Mid(2, CA_O.GetLength()- 42 - 2) + TagValue[_T("92")] + TagValue[_T("9F32")]; //HashV = SHA1(HashValueInfo) HashV =84182929FB4D1C5D5E92597CE8DB56D552F2E4F3 [√] 发卡行公钥证书摘要信息比对结果一致..
字段名 |
长度 |
描述 |
格式 |
恢复数据头 |
1 |
十六进制,值为‘6A’ |
b |
证书格式 |
1 |
十六进制,值为‘02’ |
b |
发卡行标识 |
4 |
主账号最左面的3-8个数字(在右边补上十六进制数‘F’) |
cn8 |
证书失效日期 |
2 |
MMYY,在此日期后,这张证书无效 |
n4 |
证书序列号 |
3 |
由认证中心分配给这张证书的,唯一的二进制数 |
b |
哈希算法标识 |
1 |
标识用于在数字签名方案中产生哈希结果的哈希算法 |
b |
发卡行公钥算法标识 |
1 |
标识使用在发卡行公钥上的数字签名算法 |
b |
发卡行公钥长度 |
1 |
标识发卡行公钥的模的字节长度 |
b |
发卡行公钥指数长度 |
1 |
标识发卡行公钥指数的字节长度 |
b |
发卡行公钥或发卡行公钥的最左边字节 |
NCA-36 |
如果NI ≤NCA–36,这个字段包含了在右边补上了 NCA–36–NI个值为‘BB’的字节的整个发卡行公钥。 如果NI>NCA-36,这个字段包含了发卡行公钥最高位的 N CA–36个字节 |
b |
注意:终端恢复发卡行公钥中发卡行标识必须正确, 证书失效日期必须大于5F24的值。
//发卡行公钥指数(9F32)必须等于3或2^16+1 _CA_E = 03 //发卡行公钥模 = 发卡行公钥的最左边字节 + 发卡行公钥的余项(如果有) //_CA_N = CA_O.Mid(30, CA_N.GetLength() - 72) +TagValue[_T("92")]; _CA_N =D5C5C2BFE845E14E75681F83973E1E4F9543E7FCCA49D13D82E35CD2F5B6CBDC5005CA3A7B8E92B52443AECE23C2D1BB57F76D43D0D9A339AFB4BE186CB82515EDCD9B6278BF42B31083944FC524412580680824E0A0F2FC5F41A969FC0F19B67F9054D41FF0D7D0600C8E1E51AA80B4EDBEA34411403B497A3D4C2E47BB77442F584ABF26D618B28374543D776CA628A371A4E09CE3C1FB1B49852381E38B167A69E44866421CC66B55D5727A916D65 //签名的静态数据(93) _CA_I =6B4EC2C144B1A46D42608253C157A53008D9626D70EB593294271ADF5BE8B76A57D38C82DD9B2BBBD02C6C91C046C80818D6A606ADC1FC6E2989BE0AB2CFCEE89B62EC7F132B5AFBFC65D46A7A26FD1A49586158F640169985C5BB74975585BCFC38CEFB63CB9D25EEFB3D067F418FB0C225BC86702732153FBD36FF2CE8A51F8B0116B45DE91FD5B68861383033D99FAB9B235C5D0EB2CDE256E23040FBC4ECF2EEB765192AEEAE011AE022241EFB8E //恢复签名静态应用数据 //_CA_O = DeRSA(_CA_N, _CA_E, _CA_I); _CA_O = 6A03016230BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB286C6208DA7D7B7659DF24FA3129490FCDAE43EDBC //数据验证代码(9F45),由发卡行分配的代码 TagValue["9F45"] = 6230 //BB = ('B', CA_N.GetLength() - 52); //HashValueInfo = _CA_O.Mid(2, 8) + BB +SDA_Value; //HashV = SHA1(HashValueInfo);同一张卡相同 HashV =286C6208DA7D7B7659DF24FA3129490FCDAE43ED [√] 静态签名数据Hash值比对一致......
字段名 |
长度 |
描述 |
格式 |
恢复数据头 |
1 |
十六进制,值为‘6A’ |
b |
签名数据格式 |
1 |
十六进制,值为‘03’ |
b |
哈希算法标识 |
1 |
标识用于在数字签名方案中产生哈希结果的哈希算法 |
b |
数据验证代码 |
2 |
由发卡行分配的代码 |
b |
填充字节 |
NI–26 |
填充字节由NI–26个值为‘BB’的字节组成 |
b |
哈希结果 |
20 |
需认证的静态应用数据的哈希值 |
b |
恢复数据结尾 |
1 |
十六进制,值为‘BC’ |
b |
注意:如果静态数据认证标签列表存在,并且其包含非‘82’的标签,那么静态数据认证失败。
文/yanxin8原创,获取更多信息请访问http://yanxin8.com/441.html
C++ EMV EP/ED Javascript MFC MIFARE noteCard PBOC php QPBOC WordPress wp插件 创意发明 发现 小众软件 常识 教程 旗舰版 智能卡 注册码 游记 社保 算法 美文 职场 金融 面试题 地图