認識卡片
上一篇前言提到我們的宿舍是以學生證當作刷進刷出的門禁卡
除了當門禁卡外,學生證在學校可以拿來影印(要先儲值)、借書,同時也是一張悠遊卡
由於它是悠遊卡,所以可以推論得到這是一張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”就可以找到線上的控制位元
計算器
下一篇會介紹操作存取一張卡片的流程
不好意思 我嘗試將學生證的UID寫入白卡 但怎麼樣都會失敗 反而是AABBCCDD00這種都可以成功寫入
想請問您有成功過將學生證的UID寫進白卡嗎?
有的唷,我在學校通行無阻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
再試試看是不是校驗碼的問題
希望有幫助到你:))
請問若是要悠遊卡複製到門禁卡 是否只要複製 扇區0區塊0資料就好?
悠遊卡裡面還會存餘額等等的資料
所以只複製扇區0區塊0的UID還是沒辦法使用悠遊卡的正常功能唷
請問您綠色區域的製造商資訊有改成功過嗎?
有,我的卡是水卡
區塊0可以自由讀寫
剛剛偶然間拜讀了有關資安和IC卡的文章
真的寫得很好很詳細
台灣難得有全原創關於IC卡的文章
多年來看到台灣部落格內的文章盡是匹克幫內容農場/偽原創
希望您可以一直持續地寫下去,加油!!
感謝過路人的愛戴^^
起初創這個部落格就是因為我發現自己學東西忘得很快…
所以想趁還有記憶時用自己的話把學到的都記錄下來
為了讓讀的人也有很好的瀏覽體驗所以堅持不開廣告
嗨,最近也有拷貝門禁卡的需求,偶然看到這篇文章,不過現在苦手的是沒辦法買到可改uid的卡片,可以請問您卡片去哪裡買的嗎(網路 or 實體皆可)?
我的水卡是在淘寶買的
不過不確定最近疫情淘寶還能不能運…
最近有複製磁扣的需求 偶然間看到你的文章 請問複製磁扣原理一樣嗎
安迪大大你好,謝謝你這篇詳盡的介紹文章。我正在嘗試整合多張門禁卡到一張白卡上。網路上有一說是把 A 卡 0-0 扇區的資料複製到 B 卡的 0-1 扇區,但沒有成功。請問大大有沒有什麼其他的建議?