`
bmladmin
  • 浏览: 30771 次
  • 性别: Icon_minigender_1
  • 来自: 四川成都
社区版块
存档分类
最新评论

金融ARQC、ARPC验证生成规则

阅读更多
从2012年从事金融行业的IT开发和实施工作以来,接触最多的就是IC卡片的ARQC等安全验证,只从发行IC卡以来,行业里面安全验证就是使用ARQC来验证交易的安全性,最近在项目中实施改造的时候因为前段读卡上送过来的ARQC到我系统,我系统去安全平台做ARQC验证失败,原因排查了好久都不知道什么原因,所以我自己研究了下将验证ARQC和生产ARPC的过程写下来,网上有很多关于 ARQC生成的规则文章,我这边只是记录下自己的心得,以便以后方便自己查看(以下是国密生成的规则):
1.数据准备:
  IC卡应用秘钥mdkac:F23BF4AE92B554C116139D4F67322667
  卡号:6214988660100000304
  卡序号:00
  ATC:0001
  arc:00
  交易数据aqdt:00000000000000000000000001560000000800015616051800412AB4B67D00000103A00000

2.pan的生成由卡号最后14位+卡序号的最后2位即pan=8866010000030400

3.获取卡片的分散因子PAN+(PAN XOR FFFFFFFFFFFFFFFF)即panyz=88660100000304007799FEFFFFFCFBFF

4.使用mdkac对卡片分散因子进行SM4加密得到卡片分散秘钥keyZ:016F6E76BD8E6FB4A17C28C4B05E03A8

5.分散ATC,分散ATC的规则是右补6个0x00加上ATC左补6个0x00,即:
atc1='00'||'00'||'00'||'00'||'00'||'00'||ATC||'00'||'00'||'00'||'00'||'00'||'00'
然后atc与FFFF进行异或得到的atc2=FFFE,然后分散过后的atcK=atc1+atc2=0000000000000001000000000000FFFE

6.然后使用卡片分散秘钥keyZ对atc分散因子atcK进行SM4加密得到过程秘钥skac=9ECF9220F32AE56187D3C2444967FC0E

7.使用过程秘钥skac对交易数据aqdt进行PBOC-SM4-MAC计算得到交易数据的MAC即ARQC:
179E0D01A7D1791D
计算过程代码如下(代码不全,只是过程):
// 第一步,先获取卡片分散因子,PAN+PAN XOR FFFFFFFFFFFFFFFF
		String panyz = pan + xor(pan, "FFFFFFFFFFFFFFFF");// 32位的卡片分散因子
		// 第二步,使用mdkac对pan分散因子进行SM4加密得到卡片分散秘钥Z
		String keyZ = sm4Encrpty(mkdac, panyz);
		// 第三步:分散ATC,得到ATC分散因子,1.左补12个0,右补12个0,中间加上atc;2.atc与4个F做xor;3.1+2得到atc分散因子
		String atcyz = "";
		for (int i = 1; i <= 6; i++) {
			atcyz += "00";
		}
		atcyz += atc;
		for (int i = 1; i <= 6; i++) {
			atcyz += "00";
		}
		atcyz += xor(atc, "FFFF");// atc分散因子
		// 第四步:由卡片分散秘钥Z对atc分散因子进行SM4加密得到过程密钥SKAC
		String skac = sm4Encrpty(keyZ, atcyz);// 过程分散秘钥SKAC
		// 第五步:使用过程密钥SKAC通过PBOC-3DES算法对参与计算的数据进行Mac计算得到ARQC
		PbocMacAnsiX9_9 pmac = new PbocMacAnsiX9_9();
		String iv = "00000000000000000000000000000000";
		String arqc = pmac.PBOC_SM4_MAC(aqdt, skac, 0, iv);


8.生成ARPC:
a.将arc转成3030,然后左补0至16位;即:x=3030000000000000

b.上面获取的ARQC与x进行异或得到x_y=27AE0D01A7D1791D

c.然后将x_y左补0至32位即:y=27AE0D01A7D1791D0000000000000000

d.然后使用过程秘钥对y进行SM4加密得到ARPC:DC16134D6FF5CF97

代码如下(不全):
//第一步:先转换arc 3030
		String arcbcd = HexBinary.encode(arc.getBytes());
		int arcLen = arcbcd.length();
		//第二步:拼接arc至16位
		for(int i=1;i<=8-arcLen/2;i++){
			arcbcd += "00";
		}
		//第三步:arqc与arcbcd进行xor:arqc⊕arcbcd得到y
		String arpcY = xor(arqc, arcbcd);
		//第四步:将第三步得到的y与0拼装成32位的数据
		String fordata= arpcY;
		int fordataLen = fordata.length();
		for(int i=1 ;i<=16-fordataLen/2;i++){
			fordata += "00";
		}
		//第五步:ARPC由密钥SKAC对第四步得到的数据进行3DES加密得到arpc
		result = sm4Encrpty(skac, fordata);

 
分享到:
评论

相关推荐

    Attachments-freeworld_arqc_arpcgenerator_Attachments_ARQCgenerat

    标题中的"Attachments-freeworld_arqc_arpcgenerator_Attachments_ARQCgenerat"部分暗示了这是一个与ARQC(Authorization Request Cryptogram)和ARPC(Authorization Response Cryptogram)生成相关的附件,可能是...

    pboc3.0国密升级改造点分析_tj

    包括IC卡发卡系统升级,如新增国密IC卡卡产品定义,国密+国际密码个人化模板以及参数维护,对KMS国密接口调用,以及SM2密钥(AC/MAC/ENC)的保存和国密ARQC/ARPC/TC生成和验证调用。 5. POS类系统升级 涉及到POS类...

    PBOC流程解析

    ### 联机验证(ARQC、ARPC) 除了脱机数据认证外,PBOC流程还包括联机验证过程,即通过与银行的交易处理中心联网进行数据的进一步验证。常用的方式有应用密码认证响应(ARQC)和应用密码认证确认(ARPC)。 ### 做...

    PBOCEMV之电子钱包与电子现金的区别

    例如,卡片生成ARQC(应用密文),后台使用ARPC(授权响应密文)来进行合法性验证。这种方式不仅确保了交易的安全性,还提高了系统的可靠性。 #### 五、结论 综上所述,尽管EP和EC在表面上看起来相似,但它们之间...

    中国银联银行卡联网联合技术规范V2.1 第0部分 术语与定义

    ARPC是授权响应密码,与ARQC相对,它是由发卡方在接收到授权请求后生成的加密数据,用于确认交易的合法性。ARPC同样在确保交易安全方面起着重要作用。 ##### 27. CUP Secure (China UnionPay Secure) CUP Secure是...

    中国银联银行卡联网联合技术规范V2.1(术语与定义)

    19. **ARQC(Authorization Request Cryptogram)**与**ARPC(Authorization Response Cryptogram)**:分别是在授权请求和响应过程中生成的加密信息,用于验证交易的合法性和完整性。 20. **CUPSecure(China Union Pay ...

Global site tag (gtag.js) - Google Analytics