https://blog.csdn.net/kxd_ysheng/article/details/21178101?_t=t編碼
PBOCIC讀芯片卡流程,參考上面的博客,整理了一下PBOCIC卡讀流程。spa
上面博客內容估計也是參考別人的,因此好幾處錯誤跟網上其餘的地方同樣,我將其中錯誤改正了一下,同時增長了更加詳細的說明.net
一張銀聯IC卡里面可能有多個應用,所謂應用就是卡片和終端(如讀卡器)之間的應用協議和相關的數據集,讀卡器和卡的交互其實就是和應用的交互,卡的交易其實就是選擇某個應用作交易。orm
目前卡商所生產的卡基本上都是一個應用,即使如此,但根據銀聯的規範,應用選擇這個步驟也是必不可少的。對象
使用的命令是select命令,這個命令的詳解在《中國金融集成電路(IC)卡借記貸記卡片規範(V0.8-20080325)》的附錄B中有詳細的介紹。blog
此處請求命令報文以下:索引
命令格式:選擇(Select)報文 00 A4 XXci
命令參數:00 A4 04 00 博客
0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31it
00
參數長度:20
卡片返回數據:
長度:40
值:6F 1E
84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31
A5 0C
5F 2D 02 7A 68
9F 11 01 01
88 01 01
90 00
此處返回的結果是嚴格按照TLV格式來的,此處解析出來的數據以下:
6F: FCI(File Control Information)模板
84:DF名稱
A5:FCI專用模板
88:目錄基本文件的SFI (高三位爲0,後面補100,進行讀取文件數據)
5F2D:首選語言
9F11: 髮卡行代碼表索引
BF0C:髮卡行自定義數據--(該卡沒有帶此數據)
FCI(文件控制信息)包含SFI(Short File Identification短文件標識符),目錄中的每一個應用列出一個應用。
至此,PSE選擇完成。
若是卡片對選擇支付環境的響應不是90 00,則須要嘗試逐個選擇AID。
與PSE關聯的基本文件,裏面列出支持的支付應用。
此處SFI(對應標籤是88)爲01,根據read record的規範,p2的高5位爲SFI(01==>0000 0001),低三位爲100,故p2的值爲0x0C(0000 1100)。
表 B.21讀記錄(READ RECORD)命令引用控制參數(P2)
b8 |
B7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意義 |
x |
x |
x |
x |
x |
|
|
|
SFI |
|
|
|
|
|
1 |
0 |
0 |
讀P1指定記錄 |
此處請求命令報文爲:
命令格式:讀記錄(Read Record)報文 00 B2 P1 P2 00
命令參數:00 B2 01 0C 00
參數長度:5
卡片返回數據:
長度:49
值:
70 28
61 26
4F 08 A0 00 00 03 33 01 01 01
50 0A 50 42 4F 43 20 44 45 42 49 54
9F 12 0A 50 42 4F 43 20 44 45 42 49 54
87 01 01
90 00
此處的返回結果也是按照TLV格式來編碼的,解析後爲:
70:基本數據模板
61:應用模板。有PSE才存在,含應用目錄入口相關參數
4F:應用標識符(AID)=RID+PID(應用提供商和專用應用標識符),Len=08,Value=A000000333010101
50:應用標籤,EMV規定爲必備數據,用於應用選擇,與AID相關便於記憶的數據,Len=0A,Value=50424F43204445424954
9F12 : 應用首選名稱,Len=0A,Value=50424F43204445424954
87 : 應用優先指示器01
得到一個AID後,應該選入AID列表。
此處請求命令報文爲:
命令格式:讀記錄(Read Record)報文 00 B2 P1 P2 00
命令參數:00 B2 02 0C 00
參數長度:5
卡片返回數據:
長度:2
值:6A 83
根據讀取的記錄的應用標識符加入AID列表,而後根據用戶按鍵進行選擇應用或者根據優先級選擇應用。
此處請求命令的報文爲:
命令格式:選擇(Select)報文 00 A4 P1 P2 Lc Data 00
命令參數:00 A4 04 00 07 A0 00 00 03 33 01 01 00
參數長度:13
卡片返回:
長度:45
值:
6F 45
84 08 A0 00 00 03 33 01 01 01 A5 39 50 0A 50 42 4F 43 20 44 45 42 49 54 87 01 01
9F 38 09 9F 7A 01 9F 02 06 5F 2A 02
5F 2D 02 7A 68
9F 11 01 01
9F 12 0A 50 42 4F 43 20 44 45 42 49 54
BF 0C 05 9F 4D 02 0B 0A
90 00
6F: FCI模板
84: DF名稱
9F38: PDOL的數據(9F1A:終端國家代碼;9F7A: 電子現金指示器,9F02:受權金額,5F2A:交易貨幣代碼)
5F2D:首選語言
9F11: 髮卡行代碼表索引
進行最終選擇,要求用戶輸入金額,判斷POS是否能走電子現金交易路徑,表示電子現金指示器。
該命令報文的組合須要第4步返回的PDOL數據(9F38),根據PDOL選項進行組包
請求命令報文:
表 B.12 獲取處理選項(GET PROCESSING OPTIONS)命令報文
編碼 |
值 |
CLA |
‘80’ |
INS |
‘A8’ |
P1 P2 |
‘00’ |
Lc |
‘00’ |
數據域 |
PDOL相關數據(若是存在)或8300 |
Le |
‘00’ |
命令格式:GPO報文 80 A8 00 00 XX(長度) 83(PDOL標籤) XX(PDOL長度) PDOL 00
命令參數:80 A8 00 00 0B
83 09
9F 02 06 5F 2A 02 00
參數長度:14
卡片返回:
80 16
7C 00
08 01 01 00
10 01 01 01
10 03 06 00
18 01 01 00
20 01 01 00
90 00
GPO響應格式:80 XX(長度) XX(應用交互特徵) XX(AFL)
因此,應用交互特徵是7C 00(0111 1100),AFL是08 01 01 00 10 01 01 01 10 03 06 00 18 01 01 00 20 01 01 00
此處返回的報文不是TLV格式。
7C00爲應用交互特徵,解析:
bit8:保留(RFU);
bit7:1=支持SDA; 靜態數據認證
bit6:1=支持DDA; 動態數據認證
bit5:1=支持持卡人認證
bit4:執行終端風險管理
bit3:支持髮卡行認證
bit2:保留
bit1:1=支持CDA
字節2:保留(RFU)
0801010010010101100306001801010020010100爲AFL(共5個),AFL(應用文件定位器),每一個AFL包括4個字節
字節1:bit8-bit4:SFI(短文件標識符)
bit3-bit1:000
字節2:文件中要讀的第1個記錄的記錄號(不能爲0)
字節3:文件中要讀的最後一個記錄的記錄號(大於或等於字節2)
字節4:從字節2的記錄號開始,用於靜態數據記錄的個數(從0開始,不大於(字節3)-(字節2)+1)
根據GPO返回的AFL,讀文件。
讀文件號格式(P2)爲:SFI(AFL第一個字節)左移3位,右邊補100(跟READ RECORD命令算P2同樣)。
好比上面的08 二進制就是 0000 1000 ,由於bit8-bit4纔是SFI,因此真實的是:0000 0001 。
讀取文件的時候,左移3位右補0100(代表讀取指定記錄) ,獲得0000 1100,就是0x0c。同理算P2以下:
第一個文件:08 01 01 00 字節1二進制爲0000 1000 左移右補後0000 1100 即0x0C
第二個文件:10 01 01 01 字節1二進制爲0001 0000 左移右補後0001 0100 即0x14
第三個文件:10 03 06 00 字節1二進制爲0001 0000 左移右補後0001 0100 即0x14
第四個文件:18 01 01 00 字節1二進制爲0001 1000 左移右補後0001 1100 即0x1C
第五個文件:10 01 01 00 字節1二進制爲0001 0000 左移右補後0001 0100 即0x14
表jl-1.0 分析上面返回的AFL
第n個文件 |
第一個字節 |
第二個字節(開始記錄號) |
第三個字節(結束記錄號) |
第三個字節 |
備註 |
1 |
0C |
01 |
01 |
00 |
開始到結束1個記錄 |
2 |
14 |
01 |
01 |
01 |
1個記錄 |
3 |
14 |
03 |
06 |
00 |
4個記錄 |
4 |
1C |
01 |
01 |
00 |
1個記錄 |
5 |
14 |
01 |
01 |
00 |
1個記錄 |
根據第5步的AFL解析結果,能夠組合出讀應用數據的報文。
表 B.20 讀記錄(READ RECORD)命令報文
編碼 |
值 |
CLA |
‘00’ |
INS |
‘B2’ |
P1 |
記錄號 |
P2 |
引用控制參數,見表B-21 |
Lc |
不存在 |
數據域 |
不存在 |
Le |
‘00’ |
表B.21定義了命令報文的引用控制參數。
表 B.21讀記錄(READ RECORD)命令引用控制參數
b8 |
B7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意義 |
x |
x |
x |
x |
x |
|
|
|
SFI |
|
|
|
|
|
1 |
0 |
0 |
讀P1指定記錄 |
發送
命令格式:READ RECORD(讀記錄)報文 00 B2 P1 P2 00
命令長度:5
命令參數:00 B2 01 0C 00 【根據表「jl-1.0」第一個文件】
接受
長度:
值:
70 74
57 13 6214830100237436D22112201464200755165F
9F 0B 2D 4C 49 20 58 49 4E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9F 61 28 31 34 32 34 32 39 31 39 38 32 30 35 31 34 34 34 31 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9F 62 01 00
90 00
70:模板
5F20:持卡人姓名
57:二磁道等價數據(主帳戶、分隔符、失效日期、服務嗎、PIN驗證域、自定義數據非偶數補充F)
9F0B:持卡人姓名
9F61:持卡人證件號
9F62:證件類型,00-身份證
發送:
00 B2 01 14 00 【根據表「jl-1.0」第二個文件】
接受:
70 4A
5F 24 03 22 11 30
5F 25 03 12 11 21
5A 08 62 14 83 01 00 23 74 36
5F 34 01 00
9F 07 02 FF 00
8E 0C 00 00 00 00 00 00 00 00 42 03 1E 03
9F 0D 05 D8 60 9C A8 00
9F 0E 05 00 10 00 00 00
9F0F05D8689CF800
5F28020156
9000
9F0E : 髮卡行行爲代碼(IAC)-拒絕
9F0D : 髮卡行行爲代碼(IAC)-缺省
5F28:髮卡行國家代碼
5F34:應用主帳號序列號
5F25:應用生效日期
5A :二磁道
發送:
00 B2 03 14 00 【根據表「jl-1.0」,第三個文件,第一個記錄】
接受:
7081B3
9081B0A33373F56850C06B1DE59D93F4F2A362CEA2A57C37D5DC78E3BF84914B608A43ACD22539B6C0491E88652244D2A199E6516D0C6F3C632F65202561106420FA406F530AE8D39CAF6EA5730E4A5AB15763FB42EAFA0AEE69A9E69640642E29CA15D5449B7AB74411A50EF811ACDEF4D8F93004C423E77E55AC263DA89308FCC05E3E0AA599565590C83CCE7FF6B17602F1BD7DB22C48A5A039FB97C48A8FA16083CC56DD6FEC3C6E7E81F37DCA25A949EC9000
90:髮卡行公鑰證書--用於脫機數據認證
發送:
00 B2 04 14 00 【根據表「jl-1.0」,第三個文件,第二個記錄】
接受:
7048
8F0103
920433DFA015
9F320103
9F470103
9F482A737DBBA0A11741BD57FEDF1BE60C551A88A24A82B5EB3182642F217AFA986E04DB7AC2F38057FCE8AC01
9F49039F3704
9F4A0182
9000
8F:CA公鑰索引(PKI)
9F32:髮卡行公鑰指數
9F4A:靜態數據認證標籤列表
92:髮卡行公鑰餘數
9F47:IC卡公鑰指數
9F48: IC卡公鑰餘數
9F49:動態數據認證數據對象列表(DDOL)
發送:
00 B2 05 14 00 【根據表「jl-1.0」,第三個文件,第三個記錄】
接受:
708193
93819088E48EC5AC68FD509E73786839978F465F4BDB905EF38B9FBD17147FE810EAB68EB5E86C4A23BA2E897A54892D1DAD75EE339C21603CB172C66CE312AA9B585D5F24A3827342D504AF9EC2E95407AA72CE527DC1C0BA4D051B8BA6282AEDEEE1D3725EC8CA91EC515903D7E100576B837F96ABCB789C10434AFEC23E30D33B509FBBFB40ACDB15DF282372B8F3FBC99D9000
93: 簽名的靜態應用數據-SDA
發送:
00 B2 06 14 00 【根據表「jl-1.0」,第三個文件,第四個記錄】
接受:
708194
9F468190810A5485E3B940508DDFF1E6AC2BF5B8990742BC1E11146C8BFC46D8C3C425ABA2C264CE2F478C320D198FF03E090EA61ECA3CCCF493AA886EDAC940C2F0CDC248768204DF4DEC26758B18F67E9CC7AB84C7DA55F00BDF0127CAF12B09E93C1830120E5F700BAB5D9124F209037FC3BE5BC44D34153760CB5E79890B C5D00491681ECDD1C9844874D9B0DFFF81236C899000
9F46:IC卡公鑰證書
發送:
00 B2 01 1C 00【第四個文件,第一個記錄】
接受:
7048
8C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E14
8D1A8A029F02069F03069F1A0295055F2A029A039C019F37049F2103
5F30020220
9F42020156
9F08020020
9000
5F30 : 0220 服務碼
8C:卡片風險管理數據對象列表1(CDOL1)
8D:卡片風險管理數據對象列表2 (CDOL2)
9F08:應用版本號
9F42:應用貨幣代碼
發送:
00 B2 01 24 00 【第五個文件,第一個記錄】
接受:
7008
9F140100
9F230100
9000
9F14:連續脫機交易下限
9F23:連續脫機交易上限
根據上面讀取的「卡片風險管理數據對象列表1(CDOL1)」生成該命令。
請求命令報文:
80AE40002E00000000000900000000000001560000800000015610041000B84FBA072019024C4E00000000000000000000000000000000000000
卡片返回:
801E800012E70CB84C238601F207010103A020000100000000007B168F919000
返回的數據解析:密文信息數據(L:1) + 應用交易計數器(L:2) + 應用密文(L:8) + 髮卡行應用數據