PBOC APUD指令学习--SELECT命令

一,SELECT命令的定义和范围

       SELECT命令通过文件名或AID来选择IC卡中的PSE、DDF或ADF。命令执行成功后,PSE、DDF或ADF的路径被设定。后续命令作用于与用SFI选定的PSE、DDF或ADF相联系的AEF。从IC卡的响应报文应由回送FCI组成。


二,实际例子

     1,终端发送如下指令: 00 A4 04 00  0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31

     指令分析:

     CLA: 00

     INS:  A4

     P1:  04

     P2:  00

     Lc:  0E,表示终端发送给卡片数据域的长度,这里0x0E=15,即15个字节。

     data: 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31,(即“1PAY.SYS.DDF01”的ASCII编码)终端用PSE名“1PAY.SYS.DDF01”向卡片发送SELECT命令。

     Le: 没有该字段

    

     2,指令的返回  

      卡片回应的数据:  6F 1E 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31A5 0C 88 01 01 5F 2D 02 7A 68 9F 11 0101 

解释见下表表 B.26。 成功选择PSE后回送的FCI。

 

表 A:SELECT命令报文

代码

CLA

‘00’

INS

‘A4’

P1

引用控制参数(见表B-24)

P2

选择选项(见表B-25)

Lc

‘05’ - ‘10’

Data

文件名

Le

‘00’

下表定义了SELECT命令报文的引用控制参数P1:

表 B.:SELECT命令引用控制参数

B8

b7

b6

b5

b4

b3

b2

b1

含义

0

 0

0

0

0

 

 

 

 

1

通过名称选择

 

0

0

 


下表定义了SELECT命令报文的选择选项P2:

表 B.25:SELECT命令的可选参数

b8

b7

b6

b5

b4

b3

b2

b1

含义

 

0

0

第一个有或仅有一个

1

0

下一个


命令报文数据域

 应答报文中数据域应包括所选择的PSE、DDF或ADF的FCI。

下表定义了成功选择PSE后回送的FCI:

表 C:选择PSE的应答报文 (FCI)

标识

存在性

‘6F’

FCI模板

M

 

‘84’

DF名(1PAY.SYS.DDF01)

M

‘A5’

FCI数据专用模板

M

 

‘88’

目录基本文件的SFI

M

‘5F2D’

语言选择

O

‘9F11’

发卡行代码表索引

O

‘BF0C’

发卡行自定义数据(FCI)

O

 

‘XXXX’

(第3册规定的标签)

来自从应用提供商、发卡行或IC卡供应商的1个或多个附加(专用)数据元。

O

 

JAVA PBOC-3DES-MAC加密是一种常用于金融支付领域的加密算法,特别是在中国银联的PBOC(中国人民银行金融IC规范)中。PBOC-3DES-MAC加密用于确保数据的完整性和安全性,防止数据在传输过程中被篡改。 ### PBOC-3DES-MAC加密步骤 1. **数据分组**:将需要加密的数据按8字节分组。如果最后一组数据不足8字节,则需要填充0x00。 2. **初始向量(IV)**:通常使用8字节的0x00作为初始向量。 3. **3DES加密**:使用3DES(Triple DES)算法对数据进行加密。3DES是DES算法的增强版,使用两个或三个不同的密钥进行三次DES加密。 4. **MAC计算**:对加密后的数据进行异或运算,然后再次进行3DES加密,重复此过程直到所有数据块都被处理。 ### 示例代码 以下是一个简单的JAVA实现示例: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import java.util.Base64; public class PBOC3DESMAC { private static final String TRIPLE_DES_ALGORITHM = "DESede/CBC/NoPadding"; private static final String TRIPLE_DES_TRANSFORMATION = "DESede/CBC/NoPadding"; private static final byte[] ZERO_IV = new byte[8]; public static String encrypt(String key, String data) throws Exception { byte[] keyBytes = hexStringToByteArray(key); byte[] dataBytes = hexStringToByteArray(data); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(new DESedeKeySpec(keyBytes)); Cipher cipher = Cipher.getInstance(TRIPLE_DES_TRANSFORMATION); IvParameterSpec iv = new IvParameterSpec(ZERO_IV); cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); byte[] encryptedData = cipher.doFinal(dataBytes); return bytesToHex(encryptedData); } private static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X", b)); } return sb.toString(); } public static void main(String[] args) throws Exception { String key = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; String data = "0123456789ABCDEF"; String encryptedData = encrypt(key, data); System.out.println("Encrypted Data: " + encryptedData); } } ``` ### 说明 1. **密钥和数据的格式**:密钥和数据需要以16进制字符串形式提供。 2. **3DES算法**:使用DESede(3DES)算法,模式为CBC,填充方式为NoPadding。 3. **初始向量**:使用8字节的0x00作为初始向量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值