TC、ARQC、AAC及ARPC校验方式

以下这篇文章并非原著,文档传到我这里,我已经不知道出处了,感谢作者。


TC、ARQC、AAC及ARPC校验方式

前提:

1.    获得IC卡AC子密钥,或者获得发卡行AC主密钥

    本例:

MDKAC             =     C4D689158AD9FB9D23105B91CE046D0E

2.       得到IC卡卡号及卡序列号

本例:

       PAN      =     6210220110002707355

       PAN ser =  01

1.TC、ARQC及AAC的计算方式

取IC卡AC子密钥

如果已经获得了IC卡AC子密钥则略过此步。

用发卡行主密钥分散出IC卡AC子密钥。

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

如:

       用MDKAC对2011000270735501DFEEFFFD8F8CAAFE       做3DES加密得       B8A15DA5F7043C317D9FD8F8DFE2BD75(UDK)

得过程密钥

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

1. 在ATC前补6字节0x00,对ATC取反,并在前补6字节0x00,并连接

       如:

              ATC       =     03D3

                     00000000000003D3000000000000FC2C

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

       如:

       用UDK对00000000000003D3000000000000FC2C做3DES加密得4A43440B2D932ACDC4E2776ED562EE43 (过程密钥)

校验AAC、TC及ARQC

IC卡返回的55域数据为:

待校验的密文: 81 A9 DC 93 10 F888 56

授权金额:       000000000000     9F0206

其它金额:       000000000000           9F0306

国家代码:       0156                           9F1A02

终端验证:       0000000000               9505

货币代码:       0156                           5F2A02

交易日期:       000000                       9A03

交易类型:       00                               9C01

随机数:         00000444                   9F3704

AIP:       7C00                          8202

ATC:      03D3                          9F3602

CVR:    0380A800                  9F1013

连接如上数据得:

00000000000000000000000001560000000000015600000000000004447C0003D30380A800

用过程密钥对如上数据做MAC运算得到了AAC、TC或ARQC:

       AAC、TC或ARQC              =  81A9DC9310F88856

与IC返回的密文比较 相等,校验成功!

2.ARPC的计算方式

取授权应答码

授权应答码为服务器返回的两字节数据,本例采用“00”

ARC      =     0x300x30

ARPC计算过程

1.    在ARC后补6个字节0x00,并和ARQC做异或运算

       如:

              3030000000000000异或81A9DC9310F88856

得   B199DC9310F88856

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

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

3.    命令(外部认证)

00 82 00 00 0A +ARPC(8B)+ARC(2B)

                     

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的Java代码示例来生成ARQC: ```java import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.*; import java.util.Arrays; public class ARQCGenerator { private static final String ARQC_ALGORITHM = "DESede/CBC/NoPadding"; private static final String DEK_ALGORITHM = "DESede"; public static void main(String[] args) throws Exception { // 生成随机的DEK密钥 KeyGenerator keyGenerator = KeyGenerator.getInstance(DEK_ALGORITHM); SecretKey dekKey = keyGenerator.generateKey(); // 生成随机的IV向量 SecureRandom random = SecureRandom.getInstanceStrong(); byte[] iv = new byte[8]; random.nextBytes(iv); // 生成ARQC String arqc = generateARQC("1234567890123456", 1000, dekKey, iv); System.out.println("ARQC: " + arqc); } public static String generateARQC(String pan, int amount, SecretKey dekKey, byte[] iv) throws Exception { // 计算ARQC的数据 byte[] data = calculateARQCData(pan, amount, iv); // 加密数据得到ARQC Cipher cipher = Cipher.getInstance(ARQC_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, dekKey, new IvParameterSpec(iv)); byte[] arqcBytes = cipher.doFinal(data); // 将ARQC转换为十六进制字符串并返回 return bytesToHexString(arqcBytes); } private static byte[] calculateARQCData(String pan, int amount, byte[] iv) throws Exception { // 计算ARQC的数据,包括PAN、交易金额和IV向量的哈希值 MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] panBytes = pan.getBytes(StandardCharsets.UTF_8); byte[] amountBytes = String.format("%012d", amount).getBytes(StandardCharsets.UTF_8); byte[] data = Arrays.copyOf(panBytes, panBytes.length + amountBytes.length + iv.length); System.arraycopy(amountBytes, 0, data, panBytes.length, amountBytes.length); System.arraycopy(iv, 0, data, panBytes.length + amountBytes.length, iv.length); byte[] hash = md.digest(data); // 取哈希值的前8个字节作为ARQC的数据 return Arrays.copyOf(hash, 8); } private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X", b)); } return sb.toString(); } } ``` 以上代码演示了如何生成一个ARQC,其中用到了3DES加密算法和SHA-256哈希算法。注意,这只是一个简单的示例,实际使用中还需要考虑更多的安全因素。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值