復旦微電子CPU卡髮卡流程
前言
近段時間一直在做CPU卡相關的應用,也知道簡單的去操作CPU卡相關資料,但是並沒有真正深入去了解CPU卡相關的東西;近期蒐集了部分資料,並仔細閱讀了pboc3.0規範
指令列表
FMCOS指令列表見下圖:
髮卡
簡單粗暴,直接上具體的髮卡流程,因為具體的CPU卡相關的理論在理解上還是需要一段時間,不是我這裡一兩句話就能解釋的清楚;根據個人的切身感受,最開始研究(入門)的時候更多的時候是需要知道到底該怎麼做,然後回過頭去看理論理解起來更快,因此這裡直接上乾貨;想要更多的瞭解理論可以直接百度《PBOC3.0規範》看文件去。
髮卡大的操作分為以下幾個步驟:
- 傳輸認證(外部認證)
- 卡片擦除
- 目錄檔案及使用者金鑰的建立及寫入
- 資料(二進位制資料,記錄資料)的寫入
對於傳輸通道的認證,個人覺得最通俗的理解就是獲取讀寫許可權,允許對裡面的資訊進行增刪改的操作;預設的傳輸金鑰為8個位元組的0xFF,即:FFFFFFFFFFFFFFFF
- 卡片上電覆位
個人前端是使用的手機NFC進行卡片操作,因此將卡片貼到手機NFC感應區域即已經上電覆位,建立卡片連線之後即可進行下一步的操作。 - 獲取隨機數
傳送指令:0084000008(得到8個位元組的隨機數)
指令回覆:53fd1f262ec4e6e29000(得到隨機數:53fd1f262ec4e6e2)
指令說明:00(CLA)84(INS)00(P1)00(P2)08(Le) - 對隨機數進行DES加密
加密資料:53fd1f262ec4e6e2
加密金鑰:FFFFFFFFFFFFFFFF(外部認證金鑰)
處理結果:A0DBBFC1192FF24A 傳輸認證(外部認證)
傳送指令:0082000008A0DBBFC1192FF24A(Data部分為前一步的DES處理的結果)
指令回覆:9000(認證成功)
指令說明:00(CLA)82(INS)00(P1)00(P2外部認證金鑰標識00/01)08(Lc)A0DBBFC1192FF24A(Data 8個位元組加密後的隨機數)
可能存在的錯誤回覆:- 6188
認證金鑰不存在,可能是已經做了傳輸認證並已經擦除的卡片,可以直接嘗試一下擦除卡片看是否成功,如果成功,即可做後續的動作。 - 63Cx
認證失敗,x為允許再次嘗試的次數;出現此錯誤原因可能有2個,一個是金鑰錯誤;另一個是DES加密出現錯誤;
外部認證方式不同的廠商的卡認證方式可能會存在區別,比如在淘寶淘卡的時候會明確的說他這種卡的認證方式。
- 6188
卡片擦除
擦除卡片裡面的所有資料,擦除成功之後,卡片即成為一張空白卡片
傳送指令:800E000000
指令回覆:9000(擦除成功)
指令說明:80(CLA)0E(INS)00(P1)00(P2)00(Lc)
目錄檔案及使用者金鑰的建立及寫入
這裡主要包含了主檔案的建立,金鑰檔案建立,二進位制檔案、記錄檔案的建立以及使用者金鑰的寫入
命令報文資料域
目錄檔案DF(包含MF)
檔案型別 檔案空間 建立許可權 擦除許可權 應用檔案ID 保留字 DF名稱 38 2位元組 1位元組 1位元組 XX FFFF 5-16位元組 基本檔案EF
命令報文資料域 檔案型別 BYTE1 BYTE2-3 BYTE4 BYTE5 BYTE6 BYTE7 二進位制檔案 28 檔案空間 讀許可權 寫許可權 FF 見說明 定長記錄檔案 2A 檔案空間 讀許可權 寫許可權 FF 見說明 迴圈檔案 2E 檔案空間 讀許可權 寫許可權 FF 見說明 PBOC ED/EP 2F 02 08 使用許可權 保留(00) FF 交易明細檔案短標識 變長記錄檔案 2C 檔案空間 讀許可權 寫全選 FF 見說明 金鑰檔案 3F 檔案空間 DF檔案短識別符號 中間許可權 FF FF 如果希望使用明文 MAC 寫 BYTE1 最高位需置 1 (“ 28 ”變為“ A8 ”)
如果希望使用加密寫,則BYTE1次的最高位置1(“28”變成“68”)基本檔案 EF (金鑰檔案、 PBOC ED/EP 檔案除外)的保留字的最後一個位元組定義如下:(設該位元組的為定義為 b8 ~ b1 )
b8 b7 b6 b5 b4 b3 b2 b1 含義 1 - - - - - - - 檔案不支援帶線路保護讀 0 - - - - - - - 檔案必須使用線路保護讀 - 1 1 1 - - - - 保留為1 - - - - 1 1 - - 讀操作時使用的金鑰標識 標識為00的金鑰 - - - - 1 0 - - 標識為01的金鑰 - - - - 0 1 - - 標識為02的金鑰 - - - - 0 0 - - 標識為03的金鑰 - - - - - - 1 1 寫操作時使用的金鑰標識 標識為00的金鑰 - - - - - - 1 0 標識為01的金鑰 - - - - - - 0 1 標識為02的金鑰 - - - - - - 0 0 標識為03的金鑰 對於記錄檔案(包括定長檔案、錢包檔案、迴圈檔案),檔案空間的第一個位元組為記錄的總個數,第二個位元組為記錄的長度:物理空間總數(個數*(記錄長度+1)+8)。
對於對於金鑰檔案所謂的DF短檔案識別符號,說明如下:當高三位為000時為DDF,當高三位是100時是ADF短檔案標識號。
對於 PBOC ED/EP 中所謂的 TAC 金鑰標識是指該 ED/EP 在計算 TAC 時使用到的金鑰型別為‘ 34 ’金鑰的標識;所謂交易明細檔案是指 ED/EP 在記錄交易明細時用到的短檔案識別符號。
- 所有檔案建立之後不能自動被選擇。
金鑰型別
型別 意義 34 內部金鑰 36 檔案線路保護金鑰 38 重灌口令金鑰的金鑰 39 外部認證金鑰 3A 口令金鑰 3B 解鎖口令金鑰 3C 修改透支限額 3D 圈提 3E 消費 3F 圈存金鑰
指令集列表
800E000000
80E03F000D38FFFFF0F001FFFFFFFFFFFFFF
80E00000073F005001F0FFFF
80D401000D36F0F0FF33FFFFFFFFFFFFFFFF
80D401001539F0F0AA33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
80E00001072A0213F000FFFF
80E0000507A80030F0F0FFFF
00E200081361114F09A00000000386980701500450424F43
80E03F011138036FF0F095FFFFA00000000386980701
00A4040009A00000000386980701
80E00000073F018F95F0FFFF
80D401001534F002000134343434343434343434343434343434
80D401001536F002FF3336363636363636363636363636363636
80D401001537F002FF3337373737373737373737373737373737
80D401001538F002FF3338383838383838383838383838383838
80D401001539F002443339393939393939393939393939393939
80D40101153EF00200013E013E013E013E013E013E013E013E01
80D40102153EF00200013E023E023E023E023E023E023E023E02
80D40101153FF00200013F013F013F013F013F013F013F013F01
80D40102153FF00200013F023F023F023F023F023F023F023F02
80D40101153DF00201003D013D013D013D013D013D013D013D01
80D40102153DF00201003D023D023D023D023D023D023D023D02
80D40101153CF00201003C013C013C013C013C013C013C013C01
80D40102153CF00201003C023C023C023C023C023C023C023C02
80D401000D3AF0EF013312345FFFFFFFFFFF
80E0001507A8001EF0F0FFFF
80E0001607A80027F0F0FFFF
80E00017072805DCF0F0FFFF
80E00018072E0A17F0EFFFFF
80E00001072F0208F100FF18
80E00002072F0208F000FF18
指令集說明
- MF檔案的建立
傳送指令:80E03F000D38FFFFF0F001FFFFFFFFFFFFFF
指令回覆:9000(檔案建立成功)
指令說明:80(CLA)E0(INS)3F00(P1 P2 檔案標識)0D(Lc)38(檔案型別)FFFF(檔案空間)F0(建立許可權)F0(擦除許可權)01(應用檔案ID)FFFF(保留字)FFFFFFFFFF(DF名稱) - 建立金鑰檔案
傳送指令:80E00000073F005001F0FFFF
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)0000(P1P2檔案標識)07(Lc)3F(檔案型別)0050(檔案空間)01(DF檔案短識別符號)F0(增加許可權)FF(預設)FF(預設) - 新增線路保護金鑰
傳送指令:80D401000D36F0F0FF33FFFFFFFFFFFFFFFF
指令回覆:9000(成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)0D(Lc)36(金鑰標識)F0(使用權)F0(更改權)FF(預設)33(錯誤計數器)FFFFFFFFFFFFFFFF(金鑰) - 新增外部認證金鑰
傳送指令:80D401001539F0F0AA33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
指令回覆:9000(成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)39(金鑰標識)F0(使用權)F0(更改權)AA(後續狀態)33(錯誤計數器)FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(金鑰) - 建立定長檔案
傳送指令:80E00001072A0213F000FFFF
指令回覆:9000(成功)
指令說明:80(CLA)E0(INS)0001(P1P2檔案標識)07(Lc)2A(定長檔案)0213(檔案空間)F0(讀許可權)00(寫許可權)FF(預設)FF(預設) - 建立05檔案
傳送指令:80E0000507A80030F0F0FFFF
指令回覆:9000(成功)
指令說明:80(CLA)E0(INS)0005(P1P2檔案標識)07(Lc)A8(二進位制檔案28–>A8)0030(檔案空間)F0(讀許可權)F0(寫許可權)FF(預設)FF(預設)
注:28–>A8 28=00101000 高位變1即:10101000=A8(明文+MAC校驗) - 新增檔案記錄
傳送指令:00E200081361114F09A00000000386980701500450424F43
指令回覆:9000(新增成功) - 建立EF(基本檔案)
傳送指令:80E03F011138036FF0F095FFFFA00000000386980701
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)3F01(P1 P2檔案標識)11(Lc)38(檔案型別(目錄檔案))036F(檔案空間)F0(建立許可權)F0(擦除許可權)95(應用檔案標識)FFFF(保留欄位)A00000000386980701(DF名稱 AID) - 選擇EF
傳送指令:00A4040009A00000000386980701
指令回覆:6f0b8409a000000003869807019000(成功選中)
指令說明:00(CLA)A4(INS)04(P1)00(P2)09(Lc)A00000000386980701(Data AID)
回覆說明:6f(檔案控制資訊板塊的記錄標識)0b(長度)84(DF名稱的記錄標識)09(DF名稱記錄資料長度)a00000000386980701(ADF的名稱)9000(SW1 SW2) - 建立金鑰檔案
傳送指令:80E00000073F018F95F0FFFF
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)0000(P1P2 檔案標識)07(Lc)3F(檔案型別)018F(檔案控制元件)95(DF檔案短識別符號)F0(增加許可權)FF(預設)FF(預設) - 新增內部金鑰
傳送指令:80D401001534F002000134343434343434343434343434343434
指令回覆:9000(建立成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)34(金鑰標識)F0(使用權)02(更改權)00(金鑰版本號)01(演算法標識)34343434343434343434343434343434(金鑰) - 新增線路保護金鑰(這裡的線路金鑰和前面那個所保護的檔案不同)
傳送指令:80D401001536F002FF3336363636363636363636363636363636
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)36(金鑰標識)F0(使用權)02(更改權)FF(預設FF)33(錯誤計數器)36363636363636363636363636363636(金鑰) - 新增口令解鎖金鑰
傳送指令:80D401001537F002FF3337373737373737373737373737373737
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)37(金鑰標識)F0(使用權)02(更改權)FF(預設FF)33(錯誤計數器)37373737373737373737373737373737(金鑰) - 新增口令重灌金鑰
傳送指令:80D401001538F002FF3338383838383838383838383838383838
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)38(金鑰標識)F0(使用權)02(更改權)FF(預設FF)33(錯誤計數器)38383838383838383838383838383838(金鑰) - 外部認證金鑰
傳送指令:80D401001539F002443339393939393939393939393939393939
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)15(Lc)39(金鑰標識)F0(使用權)02(更改權)44(後續狀態)33(錯誤計數器)39393939393939393939393939393939(金鑰) - 消費金鑰01
傳送指令:80D40101153EF00200013E013E013E013E013E013E013E013E01
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3E(金鑰標識)F0(使用權)02(更改權)00(金鑰版本號)01(演算法標識)3E013E013E013E013E013E013E013E01(金鑰) - 消費金鑰02
傳送指令:80D40102153EF00200013E023E023E023E023E023E023E023E02
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)02(P2)15(Lc)3E(金鑰標識)F0(使用權)02(更改權)00(金鑰版本號)01(演算法標識)3E023E023E023E023E023E023E023E02(金鑰) - 圈存金鑰01
傳送指令:80D40101153FF00200013F013F013F013F013F013F013F013F01
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3F(金鑰標識)F0(使用權)02(更改權)00(金鑰版本號)01(演算法標識)3F013F013F013F013F013F013F013F01(金鑰) - 圈存金鑰02
傳送指令:80D40102153FF00200013F023F023F023F023F023F023F023F02
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3F(金鑰標識)F0(使用權)02(更改權)00(金鑰版本號)01(演算法標識)3F023F023F023F023F023F023F023F02(金鑰) - 圈提金鑰01
傳送指令:80D40101153DF00201003D013D013D013D013D013D013D013D01
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3D(金鑰標識)F0(使用權)02(更改權)01(金鑰版本號)00(演算法標識)3D013D013D013D013D013D013D013D01(金鑰) - 圈提金鑰02
傳送指令:80D40102153DF00201003D023D023D023D023D023D023D023D02
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3D(金鑰標識)F0(使用權)02(更改權)01(金鑰版本號)00(演算法標識)3D023D023D023D023D023D023D023D02(金鑰) - 新增修改透支限額金鑰01
傳送指令:80D40101153CF00201003C013C013C013C013C013C013C013C01
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3C(金鑰標識)F0(使用權)02(更改權)01(金鑰版本號)00(演算法標識)3C013C013C013C013C013C013C013C01(金鑰) - 新增修改透支限額金鑰02
傳送指令:80D40102153CF00201003C023C023C023C023C023C023C023C02
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)01(P2)15(Lc)3C(金鑰標識)F0(使用權)02(更改權)01(金鑰版本號)00(演算法標識)3C023C023C023C023C023C023C023C02(金鑰) - 新增口令(PIN)
傳送指令:80D401000D3AF0EF013312345FFFFFFFFFFF
指令回覆:9000(新增成功)
指令說明:80(CLA)D4(INS)01(P1)00(P2)0D(Lc)3A(口令金鑰)F0(使用權)EF(預設EF)01(後續狀態)33(錯誤計數器)12345FFFFFFFFFFF(口令) - 建立15號檔案(二進位制檔案)
傳送指令:80E0001507A8001EF0F0FFFF
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)0015(P1 P2 檔案標識)07(Lc)A8(明文MAC 28(二進位制檔案高位變1)–>A8)001E(檔案空間)F0(讀許可權)F0(增加許可權)FF(預設FF)FF(預設FF)
注:28–>A8 28=00101000 高位變1即:10101000=A8(明文+MAC校驗) - 建立17號檔案(二進位制檔案)
傳送指令:80E00017072805DCF0F0FFFF
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)0017(P1 P2 檔案標識)07(Lc)28(二進位制檔案)05DC(檔案空間)F0(讀許可權)F0(新增許可權)FF(預設FF)FF(預設FF) - 建立18號檔案(迴圈檔案)
傳送指令:80E00018072E0A17F0EFFFFF
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)0018(P1 P2 檔案標識)07(Lc)2E(迴圈檔案)0A17(檔案空間)F0(讀許可權)EF(增加許可權)FF(預設FF)FF(預設FF) - 建立錢包檔案(電子存摺)
傳送指令:80E00001072F0208F100FF18
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)0001(P1 P2 檔案標識)07(Lc)2F(PBOC ED/EP)0208(預設0208)F1(使用權)00(保留00)FF(預設FF)18(交易明細檔案短標識) - 建立錢包檔案(電子錢包)
傳送指令:80E00002072F0208F000FF18
指令回覆:9000(建立成功)
指令說明:80(CLA)E0(INS)0002(P1 P2 檔案標識)07(Lc)2F(PBOC ED/EP)0208(預設0208)F0(使用權)00(保留00)FF(預設FF)18(交易明細檔案短標識)
資料(二進位制資料,記錄資料)的寫入
MF下05檔案寫入
- 選擇MF
傳送指令:00A40000023F00
指令回覆:6f15840e315041592e5359532e4444463031a5038801019000 - 取隨機數
傳送指令:0084000004
指令回覆:88bbe4e39000 - 通過寫入資料計算MAC
計算MAC方式可以通過百度搜索PBOC MAC計算工具
資料來源:04D6850034000122000001FFFF22000000000000060001201610280000000000010001000000000000000000000000000020501231
初始向量:88bbe4e300000000(隨機數+00000000)
金鑰:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(各自檔案下的線路保護金鑰)
計算結果:AE8D8774
傳送指令:04D6850034000122000001FFFF22000000000000060001201610280000000000010001000000000000000000000000000020501231AE8D8774(指令+MAC)
指令回覆:9000(新增成功)
指令說明:04(CLA)D6(INS)85(檔案標識)00(寫入資料偏移量)34(Lc Data+MAC)000122000001FFFF22000000000000060001201610280000000000010001000000000000000000000000000020501231(Data 根據情況寫入,可以隨意定義)AE8D8774(MAC)
MAC計算如下圖:
EF下15檔案寫入
- 選擇MF
傳送指令:00A40000023F00
指令回覆:6f15840e315041592e5359532e4444463031a5038801019000 - 選擇EF
傳送指令:00A4040009A00000000386980701
指令回覆:6f328409a00000000386980701a5259f0801029f0c1e0000000000000000000000000000000000000000000000000000000000009000 - 取隨機數
傳送指令:0084000004
指令回覆:a3bbcfc89000 - 通過寫入資料計算MAC
計算MAC方式可以通過百度搜索PBOC MAC計算工具
資料來源:04D6950022000122000001FFFF01010000220000000000000620160101205012310000
初始向量:a3bbcfc800000000(隨機數+00000000)
金鑰:36363636363636363636363636363636(各自檔案下的線路保護金鑰)
計算結果:96E32EF1
傳送指令:04D6950022000122000001FFFF0101000022000000000000062016010120501231000096E32EF1(指令+MAC)
指令回覆:9000(新增成功)
指令說明:04(CLA)D6(INS)95(檔案標識)00(寫入資料偏移量)22(Lc Date+Mac)000122000001FFFF01010000220000000000000620160101205012310000(Data 根據情況寫入,可以隨意定義)96E32EF1(MAC)
MAC計算如下圖:
到此,一張能正常充值和消費的CPU已經發完。