認識卡片
上一篇前言提到我們的宿舍是以學生證當作刷進刷出的門禁卡
除了當門禁卡外,學生證在學校可以拿來影印(要先儲值)、借書,同時也是一張悠遊卡
由於它是悠遊卡,所以可以推論得到這是一張MIFARE
種類的卡
MIFARE卡的種類
MIFARE
又分成四種系列:
- MIFARE Classic (年代最早出現)
- MIFARE Plus
- MIFARE Ultralight
- MIFARE DESFire
初代悠遊卡採用的是MIFARE Classic
系列的卡片,由於在2007年時陸陸續續被爆出資安漏洞
因此截至我寫這篇文章為止
悠遊卡公司也採用了MIFARE Plus
及MIFARE DESFire
新系列的卡片補足MIFARE Classic
資安不足的地方
加上我查了一下MIFARE官網,是說MIFARE Classic
好像也有新版本的卡片修補了這些漏洞
因此我不確定我這張是MIFARE
的哪個系列的卡
(題外話,測試了一下手邊的卡片,麥當勞點點卡是使用MIFARE Ultralight
)
由於我買的可修改UID
空白卡是MIFARE Classic
的S50
(亦俗稱MIFARE One
或MF1
)
所以下面的儲存構造會以MIFARE One
為主來做介紹
MIFARE One 儲存結構
MIFARE One
之所以有個One是因為它的卡片容量有1KB
(他還有個兄弟叫S70
容量是4KB)
這1KB被分為編號0到15的扇區(sector)
,總共16個,每個扇區64Bytes
其中每個扇區又有4個區塊(block)
,所以整張卡有編號0到63的區塊,每個區塊16Bytes
示意圖:
所有卡片的扇區0
區塊0
都是公開的,不需要特別先跟Key A
或Key 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 A
、Key B
)
並且控制位元
決定了兩把密鑰能夠存取的區塊權限
驗證區塊
的第0到第5個Byte存放了Key A
第6到第9個Byte存放了控制位元
第10到第15個Byte存放了Key B
驗證區塊
以外的區塊稱為資料區塊
,是實際上真的能夠儲存資料的地方
(像我們學生證裡面有學號、姓名、系級、生份證號就是放在區塊56
、區塊57
、區塊58
)
除了讀取扇區0
區塊0
是特例,不用經過Key A
或Key B
驗證外
剩下所有的區塊都要在讀取前先經過驗證
驗證是以扇區為單位,當使用該扇區的Key A
或Key B
驗證成功後,就可以根據控制位元
設定的規則做存取
至於須使用Key A
還是Key B
做驗證,以及Key A
Key B
驗證後各有什麼權限,也是看控制位元
的設定
控制位元
的存取規則解讀用手算會比較複雜,我都直接使用線上的計算器秒殺XDD(作弊~)
Google "MIFARE Classic 1K Access Bits Calculator"就可以找到線上的控制位元
計算器
下一篇會介紹操作存取一張卡片的流程
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
再試試看是不是校驗碼的問題
希望有幫助到你:))
陳先生
2019-12-19請問若是要悠遊卡複製到門禁卡 是否只要複製 扇區0區塊0資料就好?
Andy Wu
2019-12-27悠遊卡裡面還會存餘額等等的資料
所以只複製扇區0區塊0的UID還是沒辦法使用悠遊卡的正常功能唷
咖啡人
2020-01-29請問您綠色區域的製造商資訊有改成功過嗎?
Andy Wu
2020-03-17有,我的卡是水卡

區塊0可以自由讀寫
過路人
2020-06-26剛剛偶然間拜讀了有關資安和IC卡的文章
真的寫得很好很詳細
台灣難得有全原創關於IC卡的文章
多年來看到台灣部落格內的文章盡是匹克幫內容農場/偽原創
希望您可以一直持續地寫下去,加油!!
Andy Wu
2020-07-09感謝過路人的愛戴^^
起初創這個部落格就是因為我發現自己學東西忘得很快...
所以想趁還有記憶時用自己的話把學到的都記錄下來
為了讓讀的人也有很好的瀏覽體驗所以堅持不開廣告
KP
2020-07-12嗨,最近也有拷貝門禁卡的需求,偶然看到這篇文章,不過現在苦手的是沒辦法買到可改uid的卡片,可以請問您卡片去哪裡買的嗎(網路 or 實體皆可)?
Andy Wu
2020-07-13我的水卡是在淘寶買的
不過不確定最近疫情淘寶還能不能運...
亨
2021-07-22最近有複製磁扣的需求 偶然間看到你的文章 請問複製磁扣原理一樣嗎