吳晶晶,唐彥沖,曾俊瑩,路韻逸
(安陽工學(xué)院,河南 安陽 455000)
在21世紀初我國開始出現(xiàn)以Mifare1 卡(NXP Mifare1系列,以下簡稱M1 卡)為載體的自動收費系統(tǒng),例如食堂飯卡系統(tǒng)、門禁系統(tǒng)、洗浴室使用的水卡系統(tǒng)等。它的出現(xiàn)解決了卡中無電源和不需要接觸使用的難題,在電子器件領(lǐng)域內(nèi)是一個重大突破。但近年來不斷有各種新聞報道稱各高校的水卡系統(tǒng)被破解,這反映出了過去普遍使用的舊的水卡系統(tǒng)相對而言更容易被破解。
對于M1 卡的防破解有很多種方法都可以實現(xiàn),通過比較和結(jié)合實際情況,本設(shè)計使用加密且不易破解的國產(chǎn)CPU卡來代M1 卡作為水卡系統(tǒng)的載體。國產(chǎn)CPU 卡也叫作智能卡,卡內(nèi)集成了微處理器CPU、存儲單元、用戶數(shù)據(jù)存儲器EEPROM,以及芯片操作系統(tǒng)COS。CPU 卡內(nèi)置的COS 系統(tǒng)具有嚴格的數(shù)據(jù)保護和卡片鎖死功能,從根本上杜絕了被破解的弊端。另外在價格方面目前的CPU 卡已經(jīng)和M1 卡相差無幾,并且CPU 卡的讀寫設(shè)備和M1 卡的讀寫設(shè)備是互相兼容的,所以使用CPU 卡代替M1 防止水卡系統(tǒng)被破解是一個非常適合的選擇。
另一方面,舊的水卡系統(tǒng)的注冊和充值功能都需要專人在特定的地點使用特定的機器來完成,浪費人力、物力和時間,而本設(shè)計設(shè)計的自主充值功能使用戶能在線上進行充值。只需要使用手機APP 上掃描充值設(shè)備上的二維碼,就可以完成充值,這樣不僅方便了用戶,還節(jié)省了人力物力成本。
舊的水卡系統(tǒng)一般是使用的普通M1 卡作為信息的載體,由于自身存儲設(shè)計的缺陷,使得M1 卡可以通過多種方式被破解,例如暴力破解法、克隆卡片法、密鑰流竊聽等等。
結(jié)合本校洗浴室的實際情況本設(shè)計決定采用CPU 卡方式完成水卡系統(tǒng)的防破解。使用CPU 卡代替M1 卡有很大的優(yōu)勢,其一是CPU 卡的讀寫設(shè)備和M1 卡的讀寫設(shè)備是兼容的,非接觸的CPU 卡和M1 卡都符合ISO 14443 TypeA標準,兩者的工作頻率是一樣的,使用CPU 卡只需要修改設(shè)備讀寫部分的軟件代碼就可以實現(xiàn)防破解的功能。其二是CPU 卡安全性高,具有超過最大錯誤次數(shù)鎖死功能,并且用戶卡和讀卡系統(tǒng)之間需要多次的互相密碼認證,提高了系統(tǒng)的安全性能,對于防止破解有很好的效果。
使用CPU 卡替代的方式可以在不改變洗浴室的硬件,只改變設(shè)備的軟件代碼完成設(shè)備的升級,這種方式是最方便和經(jīng)濟實惠的,所以最終本設(shè)計決定采用CPU 卡替代的方式實現(xiàn)水卡系統(tǒng)的防破解。
該系統(tǒng)首先要由系統(tǒng)管理員通過C#上位機對CPU 卡進行注冊,軟件將用戶信息寫入SQL Server 數(shù)據(jù)庫中,并通過發(fā)卡設(shè)備完成CPU 卡的初始化,只有初始化過的CPU卡才可以在整個系統(tǒng)中使用,其他沒有初始化過的CPU 卡內(nèi)部沒有對應(yīng)的存儲文件是無法使用的。在管理員那里完成注冊后,用戶可以通過手機號和初始密碼6 個0 登錄手機APP,登錄手機APP 后顯示當前卡片的余額和個人的信息,用戶想要充值的時候只需要掃描充值設(shè)備上顯示的二維碼就可以完成充值。手機APP 和自助充值設(shè)備之間的通信,本系統(tǒng)是借助OneNET 云平臺實現(xiàn)的。手機APP 和充值設(shè)備之間通過MQTT 協(xié)議連接到云平臺,云平臺將對應(yīng)的信息轉(zhuǎn)發(fā)到設(shè)備上完成整個充值設(shè)備之間的通信。
消費設(shè)備因為其工作環(huán)境的影響將其脫機處理,只有卡片和設(shè)備進行通信。當用戶想要洗浴時只需要將CPU 卡放到讀卡區(qū)域,然后點擊按鈕繼電器就控制水流的電磁閥工作流出熱水。水卡系統(tǒng)整體的結(jié)構(gòu)框圖如圖1所示。
圖1 系統(tǒng)整體的結(jié)構(gòu)框圖
發(fā)卡設(shè)備硬件并不復(fù)雜,需要實現(xiàn)的主要功能就是完成CPU 卡的讀寫,因此只需要一個單片機主控MCU 和RFID讀寫外設(shè)。根據(jù)設(shè)備的需求,主控這里選擇STC8A8K,CPU 卡的讀寫芯片選擇常見的MFRC522。發(fā)卡設(shè)備通過串口接收到C#上位機發(fā)來的命令后,根據(jù)這些命令,MFRC522 發(fā)送相應(yīng)的初始化CPU 卡文件系統(tǒng)的詳細命令,從而完成對CPU 卡的初始化。
自助充值設(shè)備需要實現(xiàn)的基本功能是和手機APP通信,并將充值的金額寫入到CPU 卡中。這里需要用到LCD 顯示屏、MFRC522 芯片以及無線通信的模組SIM800C。由于自助充值功能是需要二維碼的,因此主控芯片的選擇需要選擇容量大一點的芯片,所以這里本設(shè)計選擇了頻率為72 MHz、512KFlash 的大容量芯片STM32F103ZET6。
整體設(shè)計是單片機利用SIM800C 通信模組完成和OneNET 云服務(wù)器的通信,再利用云服務(wù)器間接的完成和手機APP 之間的通信。完成通信后再利用射頻模塊實現(xiàn)手機讀寫CPU 卡中的信息,完成水卡的充值。由于充值設(shè)備不一定是唯一的,這時候本設(shè)計要利用二維碼確定具體是的那一臺充值設(shè)備和手機之間建立了通信。為了更好顯示二維碼和交互信息,本系統(tǒng)采用2.8 寸彩色液晶屏顯示信息。液晶屏的使用能夠更加顯示更加豐富的信息,而且還能給用戶更好的體驗。
自助充值設(shè)備需要實現(xiàn)的基本功能是用戶插入卡片能夠使用水流進行洗浴,這個功能的實現(xiàn)也不復(fù)雜,這里選擇和發(fā)卡設(shè)備一樣的主控MCU(STC8A8K),顯示部分使用0.96寸的小彩屏顯示CPU 卡信息和當前設(shè)備運行狀態(tài)。當用戶插入卡片后,射頻讀寫模塊讀取卡片的信息,屏幕自動亮起顯示當前水卡的卡號、剩余金額等信息。想要用水時,需要按下取水按鍵,然后電磁閥會開啟用戶就能使用。系統(tǒng)的計費為了方便采用的是計時的方式,取水后每秒鐘扣費0.01元。卡片離開或者卡內(nèi)余額使用完,設(shè)備會自動關(guān)閉電磁閥。
CPU 卡是非接觸智能卡,它符合ISO 14443 TypeA 標準。本設(shè)計使用的MFRC522 射頻讀寫芯片是也符合CPU 卡的讀寫標準,是可以完成和CPU 卡的通信。MFRC522 芯片和單片機芯片之間的通信是使用是4 線SPI 的方式,在SPI的基本通信完成后本設(shè)計通過MCU 發(fā)命令給MFRC522 完成初始化和復(fù)位后就進行CPU 卡和RC522 的通信。RC522和CPU 卡通信的時候需要先進行尋卡操作,只有在尋找到CPU 卡后,在通過外部認證、建立文件、寫入信息等操作完成CPU 卡的初始化,只有經(jīng)過初始化的CPU 卡才能在系統(tǒng)中使用。
MFRC522 與CPU 卡通信的流程圖如圖2所示。
圖2 MFRC522 與CPU 卡通信的流程圖
C#上位機和發(fā)卡設(shè)備之間這里使用串口(UART)完成它們之間的通信。UART 是一種串行數(shù)據(jù)總線接口,它能夠?qū)崿F(xiàn)全雙工通信,通常會在嵌入式設(shè)備中使用。本系統(tǒng)使用的UART 數(shù)據(jù)格式是1 個起始位,8 個數(shù)據(jù)位、0 個校驗位、1 個停止位。通過UART 可以完成C#上位機和發(fā)卡設(shè)備之間的通信,在此基礎(chǔ)上需要規(guī)定具體的通信協(xié)議命令,本設(shè)計使用兩個數(shù)字加特殊字符的方式規(guī)定發(fā)卡命令。C#上位機根據(jù)用戶的操作通過串口下發(fā)規(guī)定好的命令,發(fā)卡設(shè)備接收到命令就會執(zhí)行相對應(yīng)的命令,從而完成用戶CPU 卡的注冊。
要實現(xiàn)自助充值功能,就需要讓手機APP 和單片機之間完成通信。經(jīng)過多方的比較,本設(shè)計最終決定選擇中國移動的OneNET 云平臺。手機自帶數(shù)據(jù)流量是可以直接和OneNET 云平臺完成通信的,但是單片機本身是不可以接入互聯(lián)網(wǎng)的,因此需要利用通信模組實現(xiàn)聯(lián)網(wǎng)功能,因為系統(tǒng)本身的數(shù)據(jù)量并不大,所以本設(shè)計選擇2G 信號的SIM800C通信模組完成和OneNET 的通信。
SIM800C 模組和MCU 之間是通過UART 完成通信的,其UART 的配置方式和上文的相同,不同的是SIM800C 的聯(lián)網(wǎng)功能是通過AT 命令實現(xiàn)的。SIM800C 的使用是通過AT 進行設(shè)置,設(shè)置的步驟是SIM 卡先注冊上網(wǎng)絡(luò),然后設(shè)置成透傳模式,最后通過MQTT協(xié)議連接到OneNET云平臺。
SIM800C 連接OneNET 云平臺的流程圖如圖3所示。
圖3 SIM800C 連接OneNET 云平臺的流程圖
二維碼又稱QR Code 一種是很流行的編碼方式,它用黑白塊的排列存儲的信息,比普通的條形碼能夠存儲更多的信息,同時也具有更好的抗干擾能力。本設(shè)計用二維碼存儲充值設(shè)備的信息和當前卡片的ID 號,然后手機APP 掃描獲取到后,發(fā)送充值命令完成自助充值的功能。
系統(tǒng)生成二維碼功能是移植了官方提供的C 語言標準庫實現(xiàn)的,由于生成二維碼的算法太過復(fù)雜這里不展開做詳細的解釋,只說明移植的步驟。單片機移植生成二維碼的庫并不復(fù)雜,只需要將庫函數(shù)的.C 和.H 文件添加到工程中去,然后找到源碼文件,并找到在文件中找到bool EncodeData()函數(shù),這個函數(shù)就是生成二維碼的核心函數(shù),用法也很簡單,只需把需要轉(zhuǎn)換的字符作為參數(shù)傳入即可得到生成的二維碼數(shù)組,然后再根據(jù)數(shù)組的中的0 和1 顯示對應(yīng)的黑白方塊就能實現(xiàn)顯示二維碼了。
生成充值二維碼的流程圖如圖4所示。
圖4 生成充值二維碼的流程圖
水卡注冊需要C#上位機和發(fā)卡設(shè)備一起測試,在打開上位機軟件后,上位機軟件需要先和發(fā)卡設(shè)備建立好串口連接,然后將CPU 卡放到讀卡器的位置,點擊尋卡按鈕成功尋到卡后,會在軟件上顯示當前的卡號,錄入個人信息后點擊注冊就可以完成CPU 的初始化了。尋卡成功后的界面如圖5所示。
圖5 尋找到的CPU 卡
水卡注冊需要手機APP 和自助充值設(shè)備一起測試。首先自助充值設(shè)備需要和OneNET 云平臺建立連接,然后用戶利用手機號和密碼登錄手機APP。用戶使用CPU 靠近讀卡區(qū)域,然后設(shè)備會自動尋找CPU卡,尋找到CPU卡后會顯示,顯示當前的卡片余額和卡號等重要信息。如果用戶想要向水卡卡里充值,需要點擊充值按鈕,液晶屏幕上會自動顯示充值二維碼。這個時候我只要使用手機APP 掃描這個充值二維碼,就能識別到要充值的CPU 卡,然后再點擊充值,選擇想要充值的金額,完成充值。當充值完成后,充值設(shè)備自動返回到顯示信息界面。當充值設(shè)備沒有CPU 卡時,手機APP 上的充值功能是不可以使用的。經(jīng)過測試,自助充值各個步驟都可以實現(xiàn),并運行穩(wěn)定,說明自助充值功能能夠?qū)崿F(xiàn)。
顯示充值二維碼的界面如圖6所示。
圖6 顯示的充值二維碼的界面
水卡消費設(shè)備獨立運行不需要聯(lián)網(wǎng),測試方式非常簡單,卡片放到讀卡區(qū)域,0.96 寸的液晶彩屏?xí)詣语@示當前卡片的余額、卡號等信息。當用戶想要使用時,只需要按下取水按鈕,控制水流的電磁閥就會開啟,系統(tǒng)就會開始扣費。當CPU 卡離開時,電磁閥自動關(guān)閉,屏幕自動進入息屏狀態(tài)。經(jīng)過測試,消費模塊的各個功能良好,能夠完成正常的出水和扣費以及CPU 卡信息的顯示。當用戶將水卡放到消費模塊上,液晶屏?xí)詣恿疗鸩@示當前卡片上的余額,按下按鍵1 電磁閥打開有水流水,同時開始每秒鐘扣除0.01 元,當卡片移走時屏幕自動熄滅,電磁閥關(guān)閉。消費設(shè)備有水卡正在消費的界面如圖7所示。
圖7 水卡正在使用的界面
本文主要描述了基于RFID 的防破解水卡系統(tǒng)的研究意義、實現(xiàn)過程以及設(shè)計方法。本設(shè)計通過RFID 技術(shù)完成了水卡系統(tǒng)的升級,并通過使用CPU 替換M1 卡的方式確保了系統(tǒng)的安全,并在原來的基礎(chǔ)上增加了自助充值功能,方便了用戶和商家的使用。在未來發(fā)展前景中,計劃將本文所研究的防破解水卡應(yīng)用到各大高校中,并對其進行進一步的延伸,例如防破解門禁卡、防破解校園卡、購物卡等等。