• 金融系列6《借贷记交易流程》


    1.应用选择


          终端发送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
     


     

    2. 应用初始化

         

          终端发送到卡的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


    3. 读应用数据

           终端通过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


     4. 静态数据认证


    终端支持:非对称加密算法和哈希算法;至少支持六组认证中心公钥,公钥长度最大可至1984位;

    SDA:验证卡内数据的正确性

    DDA:验证卡内数据的正确性及卡的合法性

    CDA:将动态数据认证(DDA)和应用密文生成结合起来,提供对卡内数据、卡片本身和交易安全的认证

    在一个交易中,最多只执行一种脱机数据认证方法

     

    1)  由终端恢复认证中心公钥。

    2)  由终端恢复发卡行公钥。

    3)  由终端验证签名的静态应用数据。

     




    4.1 恢复发卡行公钥

    //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的值。

     

     

    4.2 恢复签名静态应用数据

    //发卡行公钥指数(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插件 创意发明 发现 小众软件 常识 教程 旗舰版 智能卡 注册码 游记 社保 算法 美文 职场 金融 面试题 地图  


    Meet so Meet. C plusplus I-PLUS....
  • 相关阅读:
    作业第十六周
    web、app、小程序测试异同点
    接口测试用例演进
    Python中“if __name__=='__main__':”
    iPhone发布内测程序的方法
    我的2020
    python 参数笔记 --> 位置参数 关键字参数 命名参数 形式参数 默认参数 可变参数 可选参数 位置顺序
    uwsgi 热部署 热启动 热更新
    Supervisor 进程管理工具 笔记
    spring Boot----注解驱动开发
  • 原文地址:https://www.cnblogs.com/iplus/p/4467215.html
Copyright © 2020-2023  润新知