转载:https://www.cnblogs.com/ttss/p/4364328.html

ARQC:authenticate request cryptogram,授权请求报文

ARPC:authenticate response cryptogram,授权响应报文

AC:application cryptogram,应用密文

AAC:application authenticate cryptogram,应用认证密文

TC:transaction certificate,交易证书

ATC:application transaction counter,应用交易计数器

ARC:authenticate response code,授权应答码

前提: 
1. 获得IC卡AC子密钥(应用子密钥),或者获得发卡行AC主密钥(应用主密钥)  本例假设卡片的应用主密钥为MDKAC,十六字节: 
MDKAC  = C4D689158AD9FB9D23105B91CE046D0E 
2. 已知IC卡卡号PAN(5A)及卡序列号(5F34) 
本例:  PAN = 6210220110002707355  卡号一般为19位,最后一位是校验位,  PAN ser =  01 ,卡序列号一般是一个字节,存储在tag5F34中

二、TC、ARQC及AAC的计算

a.首先需要取IC卡AC子密钥(应用子密钥),如果已经获得了IC卡AC子密钥(应用子密钥)则略过此步。

获取应用子密钥的方法:  用发卡行的应用主密钥===》分散===》IC卡的应用子密钥

用发卡行主密钥分散出IC卡AC子密钥。方法为使用发卡行主密钥,对PAN(卡号)的后14位(如果PAN不足14位前面补0)加PAN序列号(卡序列号,tag5F34)(共8B)和对此取反的8个字节连接得到的16字节数据,做3DES加密计算就得到IC卡AC子密钥(应用子密钥)。

如:  用MDKAC=C4D689158AD9FB9D23105B91CE046D0E    PAN = 62102 20110002707355  ,PAN ser =   01

对20110002707355 01 DFEEFFFD8F8CAAFE 做3DES加密得 B8A15DA5F7043C317D9FD8F8DFE2BD75(UDK)应用子密钥

(2011000270735501)  =》取反  =》( DFEEFFFD8F8CAAFE)

(这就是所谓的有应用主密钥分散得到应用子密钥的过程)

b.计算得到过程密钥:

用IC卡AC子密钥(应用子密钥),对交易计数器ATC做3DES加密:

1.在ATC前补6字节0x00,对ATC取反,并在前补6字节0x00,并连接成16字节的数据,作为3DES的加密数据

例 如:ATC = 03D3 则  链接后的数据为: 00000000000003D3 000000000000FC2C     (其中FC2C为03D3取反后的值,可以用计算器(程序员模式)验证)

2. 用IC卡的AC子密钥(应用子密钥)对如上数据做3DES加密得过程密钥:

如: 用UDK对00000000000003D3000000000000FC2C做3DES加密得到的结果即是:4A43440B2D932ACDC4E2776ED562EE43 (过程密钥 )

3.校验AAC、TC及ARQC

IC卡返回的55域数据为:      待校验的密文: 81 A9 DC 93 10 F8 88 56

授权金额:                     000000000000                                  9F0206

其它金额:                     000000000000                                  9F0306

国家代码:                     0156                                                9F1A02

终端验证:                     0000000000                                     9505

货币代码:                     0156                                                5F2A0

交易日期:                     000000                                            9A03

交易类型:                     00                                                   9C01

随机数:                        00000444                                        9F3704

AIP:                           7C00                                                 8202

ATC:                          03D3                                                9F3602

CVR:                          0380A800                                        9F1013

连接如上数据得:

000000000000 000000000000 0156 0000000000 0156 00000000 00000444 7C00 03D3 0380A800

用过程密钥对如上数据做MAC运算得到了AAC(应用认证密文)、TC(交易证书)或ARQC(授权响应报文):

AAC、TC或ARQC  =   81A9DC9310F88856 与IC卡返回的响应密文比较相等,校验成功!

三、ARPC的计算方式

a.取授权应答码(ARC)

授权应答码为服务器返回的两字节数据,本例假设为:“00”  则ARC = 0x30 0x30  (十六进制)

ARPC计算过程

1. 在ARC后补6个字节0x00,并和ARQC做异或运算  如:   3030 000000000000 异或(XOR) 81A9DC9310F88856  得 B199DC9310F88856

2. 使用过程密钥对异或结果做3DES加密运算就得到ARPC

过程密钥:4A43440B2D932ACDC4E2776ED562EE43 对B199DC9310F88856 做3DES加密运算得ARPC密文:84DD63A221F915CA(ARPC)

3. 命令(外部认证)  00 82 00 00 0A +ARPC(8B)+ARC(2B)

ARQC与ARPC的生成和校验方法的更多相关文章

  1. 金融IC卡 ARQC和ARPC计算方法和实例(转)

    假设发卡行的IC卡应用密钥如下:   PBOC_IMK_AC               F0C34A8124CEE0A91A0B034AA97D6EAC PBOC_IMK_ENC           ...

  2. Eclipse用法和技巧三:自动生成Main方法2

    上一篇文章里面介绍了新建文件时候自动添加main方法,这里接着介绍自动联想main方法.       步骤一:输入"main” 步骤二:保持光标在上图位置,按ALT + /,再回车 上一篇文 ...

  3. Eclipse用法和技巧二:自动生成Main方法1

    刚开始编写java小程序,基本都要用到main方法.后期开发大一点的程序,也可以用main方法进行单元测试.总是编写main方法,感觉太无聊了,幸好Eclipse可以帮我们自动生成main方法.见图: ...

  4. Java的注释和Javadoc在eclipse生成的方法 – Break易站

    本文内容来自:Java的注释和Javadoc在eclipse生成的方法 – Break易站 1.  Java的注释 Java里有两种注释风格.下面这个写法是非常常见的 1 2 3 4 /*This i ...

  5. Core文件简单介绍及生成设置方法

    Core文件简单介绍及生成设置方法 Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试.当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文 ...

  6. 针对myeclipse6.5无法自动生成toString方法

    public void getToStringSTR(){ Field[] fs = this.getClass().getDeclaredFields(); for (int i = 0; i &l ...

  7. SQL语句中生成UUID方法

    SQL语句中生成UUID方法为UUID() 生成带横线UUID: select UUID()                         形如:abaffaca-fd55-11e5-b3d0-d2 ...

  8. FastAdmin 一键 CRUD 生成时方法不存在的问题分析

    FastAdmin 一键 CRUD 生成时方法不存在的问题分析 有群友反馈 使用 一键 CRUD 生成时不成功. 我试了以下命令 php think crud -t test -u 1 是成功的. 再 ...

  9. Spring中使用事务搭建转账环境方法二 相对简便的注解方法 ——配置文件注入对象属性需要setter方法 注解方法,不需要生成setter方法

    XML配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

随机推荐

  1. mysql 数据表操作 目录

    mysql 数据表操作 存储引擎介绍 mysql 使用存储引擎 mysql 数据表的增删改查 mysql 数据类型 mysql 约束条件

  2. larabbs安装教程

    LaraBBS 是一个简洁的论坛应用,使用 Laravel5.5 编写而成.https://github.com/summerblue/larabbs 1. 克隆源代码克隆 larabbs 源代码到本 ...

  3. shell脚本编写实例

    实际案例 1.判断接收参数个数大于1 [ $# -lt 1 ] && echo "至少需要一个参数" && { echo "我要退出了.. ...

  4. 007-docker-安装-mysql:5.6

    1.搜索镜像 docker search mysql 2.拉取合适镜像 docker pull mysql:5.6 docker images 3.使用镜像 docker run -p 3306:33 ...

  5. RN-ios模拟器上调出中文输入法

    react-native 项目:在ios模拟器上需要拼写汉字,步骤是, 1.在模拟器的设置-通用-语言与地区-iphone语言设置为:简体中文 2.模拟器的 Hardware-Keyboard-勾选下 ...

  6. python线程中的join(转)

    Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多 ...

  7. nginx的访问控制

    一.基于Basic Auth认证与基于IP的访问控制 一.基于Basic Auth认证 Nginx提供HTTP的Basic Auth功能,配置了Basic Auth之后,需要输入正确的用户名和密码之后 ...

  8. Linux下fork机制详解(以PHP为例)

    考:https://blog.csdn.net/jason314/article/details/5640969 1.fork简介 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统 ...

  9. 移动端--touch事件与点透问题

    也来说说touch事件与点击穿透问题: http://blog.csdn.net/alex8046/article/details/52299785

  10. MySQL数据类型--与MySQL零距离接触 3-2 外键约束的要求解析

    列级约束:只针对某一个字段 表级约束:约束针对2个或2个以上的字段 约束类型是按功能来划分. 外键约束:保持数据一致性,完整性.实现数据表的一对一或一对多的关系.这就是把MySQL称为关系型数据库的根 ...