複製一張宿舍門禁卡(二) MIFARE One 儲存結構

認識卡片

上一篇前言提到我們的宿舍是以學生證當作刷進刷出的門禁卡

除了當門禁卡外,學生證在學校可以拿來影印(要先儲值)、借書,同時也是一張悠遊卡

由於它是悠遊卡,所以可以推論得到這是一張MIFARE種類的卡

 

MIFARE卡的種類

MIFARE又分成四種系列:

  • MIFARE Classic (年代最早出現)
  • MIFARE Plus
  • MIFARE Ultralight
  • MIFARE DESFire

 
初代悠遊卡採用的是MIFARE Classic系列的卡片,由於在2007年時陸陸續續被爆出資安漏洞

因此截至我寫這篇文章為止

悠遊卡公司也採用了MIFARE PlusMIFARE DESFire新系列的卡片補足MIFARE Classic資安不足的地方

加上我查了一下MIFARE官網,是說MIFARE Classic好像也有新版本的卡片修補了這些漏洞

因此我不確定我這張是MIFARE的哪個系列的卡

(題外話,測試了一下手邊的卡片,麥當勞點點卡是使用MIFARE Ultralight)

 
由於我買的可修改UID空白卡是MIFARE ClassicS50(亦俗稱MIFARE OneMF1)

所以下面的儲存構造會以MIFARE One為主來做介紹

 

MIFARE One 儲存結構

MIFARE One之所以有個One是因為它的卡片容量有1KB
(他還有個兄弟叫S70容量是4KB)

這1KB被分為編號0到15的扇區(sector),總共16個,每個扇區64Bytes

其中每個扇區又有4個區塊(block),所以整張卡有編號0到63的區塊,每個區塊16Bytes

示意圖:

所有卡片的扇區0 區塊0都是公開的,不需要特別先跟Key AKey B驗證才能讀取

第0扇區 第0區塊的前4個Byte放置了該張卡的UID

第5個Byte是校驗碼,也就是拿前4個Byte出來做XOR的結果

以圖片範例來說,第5個Byte(AA後面那格)要填00 (DD ⊕ CC ⊕ BB ⊕ AA = 00)

如果校驗碼沒有follow這樣的規則走,在讀卡時會讀不出卡號且顯示讀卡錯誤

 
由於它的儲存方式類似Little Endian的形式,所以要把前4個Byte的UID解讀成十進位10碼(也就是上一篇說可以芝麻開門的神奇10碼)時要由後往前讀

圖片範例的UID即(AABBCCDD)hex = 2864434397 (如果長度不足十位則前面補0)

這裡是我們等等準備要實作修改的區塊

(正常的卡片扇區0 區塊0是無法修改的,要修改要特別去買俗稱的水卡白卡,如我第一篇在淘寶買的)

 
UID校驗碼後面的11個Byte(綠色區域)是該張卡的製造商資訊

比較特別的是每個扇區的最後一個區塊,也就是區塊3區塊7區塊11、…、區塊63是所謂的驗證區塊

每個驗證區塊裡面放了兩把可以存取這個扇區的密鑰(Key AKey B)

並且控制位元決定了兩把密鑰能夠存取的區塊權限

驗證區塊的第0到第5個Byte存放了Key A

第6到第9個Byte存放了控制位元

第10到第15個Byte存放了Key B

 
驗證區塊以外的區塊稱為資料區塊,是實際上真的能夠儲存資料的地方
(像我們學生證裡面有學號、姓名、系級、生份證號就是放在區塊56區塊57區塊58)

除了讀取扇區0 區塊0是特例,不用經過Key AKey B驗證外

剩下所有的區塊都要在讀取前先經過驗證

 
驗證是以扇區為單位,當使用該扇區的Key AKey B驗證成功後,就可以根據控制位元設定的規則做存取

至於須使用Key A還是Key B做驗證,以及Key A Key B驗證後各有什麼權限,也是看控制位元的設定

控制位元的存取規則解讀用手算會比較複雜,我都直接使用線上的計算器秒殺XDD(作弊~)

Google “MIFARE Classic 1K Access Bits Calculator”就可以找到線上的控制位元計算器

 
下一篇會介紹操作存取一張卡片的流程

 
[上一篇] 複製一張宿舍門禁卡(一) 前言
[下一篇] 複製一張宿舍門禁卡(三) 操作存取卡片流程


2 則迴響

  • S

    2018-08-26

    不好意思 我嘗試將學生證的UID寫入白卡 但怎麼樣都會失敗 反而是AABBCCDD00這種都可以成功寫入
    想請問您有成功過將學生證的UID寫進白卡嗎?

    回復
    • Andy Wu

      2018-08-26

      有的唷,我在學校通行無阻XDD

      回到正題
      如果是AABBCCDD00可以,但學生證的UID不行
      可能是校驗碼沒有都設置好

      假如學生證UID是0123456789(如果從門進讀卡機看到的是十進位碼)
      先把它轉成16進位0x75BCD15,補零對齊8 digit,0x07 5B CD 15
      因為卡片讀取時是Little Endian的方式
      所以寫入時前四個byte要反過來填成15 CD 5B 07

      第五個byte校驗碼就把前四個byte拿來做XOR
      (15 ⊕ CD ⊕ 5B ⊕ 07 = 84)
      所以填84

      最終寫入時就會變成 15 CD 5B 07 84

      再試試看是不是校驗碼的問題
      希望有幫助到你:))

      回復

發佈留言