1. 程式人生 > >復旦微電子CPU卡髮卡流程

復旦微電子CPU卡髮卡流程

前言

近段時間一直在做CPU卡相關的應用,也知道簡單的去操作CPU卡相關資料,但是並沒有真正深入去了解CPU卡相關的東西;近期蒐集了部分資料,並仔細閱讀了pboc3.0規範

復旦FM1208技術手冊等相關文件,並在淘寶上淘了幾張復旦的白卡,花了整整一週的時間,終於自己發了幾張測試卡併成功進行了充值和消費操作,因此,分享一下研究的結果同時也算是做筆記了,便於日後檢視及回顧。

指令列表

FMCOS指令列表見下圖:

髮卡

簡單粗暴,直接上具體的髮卡流程,因為具體的CPU卡相關的理論在理解上還是需要一段時間,不是我這裡一兩句話就能解釋的清楚;根據個人的切身感受,最開始研究(入門)的時候更多的時候是需要知道到底該怎麼做,然後回過頭去看理論理解起來更快,因此這裡直接上乾貨;想要更多的瞭解理論可以直接百度《PBOC3.0規範》看文件去。
髮卡大的操作分為以下幾個步驟:

  1. 傳輸認證(外部認證)
  2. 卡片擦除
  3. 目錄檔案及使用者金鑰的建立及寫入
  4. 資料(二進位制資料,記錄資料)的寫入

對於傳輸通道的認證,個人覺得最通俗的理解就是獲取讀寫許可權,允許對裡面的資訊進行增刪改的操作;預設的傳輸金鑰為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加密出現錯誤;

    外部認證方式不同的廠商的卡認證方式可能會存在區別,比如在淘寶淘卡的時候會明確的說他這種卡的認證方式。

卡片擦除

擦除卡片裡面的所有資料,擦除成功之後,卡片即成為一張空白卡片

傳送指令: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已經發完。