複製一張宿舍門禁卡(三) 操作存取卡片流程

上一篇大略講解了MIFARE One卡片的儲存結構,所以這篇我們會著重於卡片與讀卡機之間的通訊

 
MIFARE One是由NXP Semiconductors(舊稱Philips Electronics)所研發的

卡片的通訊協定是走國際標準ISO 14443 Type A,並以13.56 MHz的頻率進行通訊

先來看一下操作存取卡片的流程圖,或做通訊過程:

 

尋卡請求與卡片回應

這步很單純

當我們將卡片靠近插著電正在作用中的讀卡機時,讀卡機會對卡片發出尋卡請求REQA

收到尋卡請求的卡片就會回應讀卡機 衝殺小(好兇的卡)ATQA

好讓讀卡機知道目前有卡片在感應區內

p.s.
REQA全名Request Command, Type A
ATQA全名Answer to Request acc. to ISO/IEC 14443-4

 

防衝突迴圈

接著,讀卡機會對卡片發出請求,要卡片提供UIDSAK

UID就是第一篇所介紹的卡片唯一識別碼,俗稱內碼

SAK是類別識別碼,用來辨識卡片是哪個種類的,因為不同種類的卡有不同的操作協定

至於為什麼叫防衝突「迴圈」,因為如果卡片不只一張

在傳輸過程中有機會傳輸缺失或數據沒有被正確接收

(其實就算只有一張,卡片距離讀卡機太遠也有可能傳輸缺失或數據沒有被正確接收)

所以只要讀卡機沒有收到卡片正確的UIDSAK,一律叫卡片重傳,而此行為就像迴圈

 

選擇卡片

現在讀卡機握有感應區內卡片的UIDSAK

讀卡機會以UID挑一張卡出來,並通知卡片「奴才!你被朕選中了!」

(如果是自己寫程式調用api可以指定「只」要哪張卡)

卡片收到自己被選中的通知後,會叩謝皇上聖恩回傳自己的容量資訊給讀卡機

經過這樣的來往選妃,這張卡就變成我們要存取操作的對象了

而其它沒有被選中的卡會進入待命狀態

 
一般只驗證UID的門禁做到這部份就結束

如果UID跟門禁後端資料庫內的卡號匹配相符,就會開門放行

這也就是我們這整篇大主題要來改UID騙門禁系統的原理

 

三次相互認證

在進行三次相互認證前,我們要先將欲存取扇區的Key載入到讀卡機的ROM內

有些讀卡機的api是可以每次做三次相互認證每次提供密碼當成參數的

因讀卡機而異

然後讀卡機會發出請求,要與卡片進驗證,這個請求包含要驗證的是哪個扇區,以Key A還是Key B驗證

  • 卡片收到請求後會對讀卡機發出一段隨機數

  • 讀卡機接著用ROM內的Key或剛剛當成參數傳入的Key加密這段隨機數,回傳給卡片

  • 卡片以約定好的Key解密,若得出同一串隨機數,代表Key驗證成功,此時回傳讀卡機一個驗證成功訊息

 
換句話說,因為MIFARE One採用的是Crypto-1對稱式加密

如果 讀卡機用的加密Key ≠ 卡片的解密Key

則一定不會得出與一開始一樣的那段隨機數,卡片即可判斷驗證失敗,並立即終止與讀卡機的對話

由於這樣的驗證過程有三個步驟,所以稱為三次相互認證

 

存取卡片

如果上述流程都完成後,就可以對卡片進行存取啦

卡片的讀寫最小單位是區塊,因此,可以操做的功能有:

  • 讀取 (Read Block)
    以一整個區塊為單位做讀取
  • 寫入 (Write Block)
    以一整個區塊為單位做寫入
  • 加值 (Increment)
    將區塊所表示的值加上一個特定的值,並將結果存入 寫入暫存器
  • 減值 (Decrement)
    將區塊所表示的值減去一個特定的值,並將結果存入 寫入暫存器
  • 搬動 (Transfer)
    將寫入暫存器的值apply到區塊
  • 恢復 (Restore)
    將區塊的值復原到 寫入暫存器
  • 暫停 (Halt)
    將該卡片設定為待命狀態

如果要操作另一個扇區,則需要重新執行三次相互認證

 
 
到這裡為止,我們已經了解整個卡片的儲存結構及操作存取流程了

下一篇就來實作複製UID

 

[上一篇] 複製一張宿舍門禁卡(二) MIFARE One 儲存結構
[下一篇] 複製一張宿舍門禁卡(四) 複製UID至水卡


發佈留言