上一篇大略講解了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
防衝突迴圈
接著,讀卡機會對卡片發出請求,要卡片提供UID
跟SAK
UID
就是第一篇所介紹的卡片唯一識別碼,俗稱內碼
SAK
是類別識別碼,用來辨識卡片是哪個種類的,因為不同種類的卡有不同的操作協定
至於為什麼叫防衝突「迴圈」,因為如果卡片不只一張
在傳輸過程中有機會傳輸缺失或數據沒有被正確接收
(其實就算只有一張,卡片距離讀卡機太遠也有可能傳輸缺失或數據沒有被正確接收)
所以只要讀卡機沒有收到卡片正確的UID
跟SAK
,一律叫卡片重傳,而此行為就像迴圈
選擇卡片
現在讀卡機握有感應區內卡片的UID
跟SAK
讀卡機會以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至水卡