1、序言 非接觸式智能卡已經(jīng)廣泛地應用于各類門禁控制系統(tǒng),公共交通支付系統(tǒng),e-purse系統(tǒng),高速公路不停車收費系統(tǒng),IBMS(智能大樓管理系統(tǒng)),海關過境身份識別,以及醫(yī)療保險系統(tǒng)等等。 非接觸式智能卡以其高度安全保密性,通信高速性,使用方便性,成本日漸低廉等而受到廣泛使用,給我們的生活質(zhì)量帶來了很大的提高。因此,如何認識、理解智能卡,特別是帶有非常神秘色彩的非接觸式智能卡,已引起很多智能卡的使用者,包括智能卡專業(yè)研發(fā)的IT科研人員的極大的興趣和愛好。筆者在此很愿意將自己多年來在智能卡(接觸式智能卡及非接觸式智能卡)方面的研究及其軟硬件應用開發(fā)的經(jīng)驗與大家一同交流和分享,以取得我國金卡工程事業(yè)的更進一步的發(fā)展。 在此,筆者將以符合ISO/IEC14443TYPEA標準的Mifare1S50系列非接觸式智能卡及其讀寫設備專用IC(ASIC)RC150/170模塊為對象,與大家一起就“關于非接觸式智能卡及其讀寫器ASIC模塊之‘密碼操作’”作一些研究與探討,并將用標準的Intel-51系列微處理器匯編語言進行實際的應用程序的開發(fā)。在筆者曾設計和開發(fā)的眾多智能卡項目中,本文所給出的應用程序都有著良好的運行效果。
2、非接觸式智能卡及其讀寫器ASIC模塊RC150/170 Mifare1S50非接觸式智能卡片有著16個Sector(扇區(qū));每個Sector包含4個Block(塊);每個Block具有16個byte的存儲容量。Sector被定義為Sector0至Sector15;Block被分為Block0至Block3;整個Mifare1S50非接觸式智能卡共有64個Block。 Sector0中的Block0記錄了該張智能卡的序列號(SerialNumber)以及生產(chǎn)廠商的標志信息等,這些信息已在卡片出廠時固化,不能更改。因此該Block不能再復用為應用數(shù)據(jù)塊。 每個Sector中的Block3被特別用來存放對該Sector中應用塊Block0,1,2及其本身Block3進行數(shù)據(jù)存取的密碼及存取權限。整個Mifare1S50非接觸式智能卡共有16個Block3。根據(jù)絕對地址編址,他們可被編為Block3(在Sector0中),Block7(在Sector1中),Block11(在Sector2中),以及Block63(在Sector15中)等等。 對于某一Sector中的Block3的絕對地址編址可以由下列公式計算得到: Block X=(N+1)*4-1 其中:X:絕對地址編址的Block塊號 N:Sector扇號,0至15 通常每個扇區(qū)的Block0,1,2都存放著非常保密的數(shù)據(jù),例如坐公交車/出租車前在公交公司指定地點已購買的車資錢款,智能大廈/智能小區(qū)進出時所需的控制信息,股票交易時持有股票交易智能卡片者必須對已存放在智能卡中的交易密碼數(shù)據(jù)(例如帳戶、存款信息、已買進股票數(shù)量/品種等等)進行確認,才能得以股票交易,等等。 由于每一個Block3中包含了該扇區(qū)的密碼字節(jié)以及對該扇區(qū)中其余Block0,1,2進行數(shù)據(jù)處理的存取控制權限字節(jié),因此如何操作處理Block3將是很重要的內(nèi)容。以下將展開對每個扇區(qū)的Block3進行研究。 Block3有16個byte組成。前6個字節(jié)是密碼A(KEYA),KEYA的缺省值可能為“A0A1A2A3A4A5”;最后6個字節(jié)是密碼B(KEYB),KEYB的缺省值可能為“B0B1B2B3B4B5”;中間4個字節(jié)是控制字節(jié),缺省值可能為“FFH07H80H69H”;利用KEYA或KEYB并遵守早已定義在4個控制字節(jié)中的存取條件,我們便能對該密碼(KEYA或KEYB)所對應的Sector內(nèi)的應用塊Block0,1,2進行數(shù)據(jù)讀/寫/更新等操作。 由于非接觸式智能卡的操作,包括數(shù)據(jù)流的傳遞等都是以“非接觸”方式來完成的,因此在MCU與非接觸式智能卡之間必須有一個傳遞密碼(或數(shù)據(jù)流)的中間媒體,即ASIC模塊。RC150/170就是這樣一種ASIC模塊。它擔負著非接觸式智能卡與MCU(微處理機)之間所有的密碼/數(shù)據(jù)相互傳遞的重要任務。對非接觸式智能卡進行密碼操作,變成對RC150/170ASIC模塊進行密碼操作。RC150/170ASIC模塊與非接觸式智能卡之間的信息傳遞(包括密碼等)對用戶來說是透明的,會自動傳遞并完成。因此如何對非接觸式智能卡進行“密碼操作”(對Block3的操作)變成如何對RC150/170ASIC模塊進行密碼操作。Philips公司的MCM200模塊,MCM500模塊或SB201,SB601(Uni-VisionEngineeringLtd.的產(chǎn)品)模塊中都包含有RC150/170ASIC模塊,因此本文所討論的內(nèi)容,包括下面設計的程序等,也適用于這些模塊。RC170是RC150的新一代ASIC模塊,速度較快。 現(xiàn)在我們廣泛使用的非接觸式智能卡讀寫設備中大都包含有以上所列的ASIC模塊之一。 圖1顯示了在用戶(MCU)與非接觸式智能卡之間基本的密碼傳輸關系,并請?zhí)貏e注意ASIC模塊RC150/170的作用等等。
圖1ASIC模塊密碼傳輸關系圖 在研究ASIC模塊RC150/170的時候,我們必須關注所有與“密碼操作”有關的寄存器/存儲器的情況。 ●密碼數(shù)據(jù)寄存器KeyDataRegister(寄存器地址:0x0A); ●密碼地址寄存器KeyAddressRegister(寄存器地址:0x0C); ●密碼狀態(tài)/控制寄存器KeyStatus&ControlRegister(KEYSTACON)(寄存器地址:0x0B); ●其他相關寄存器。 所有這些與“密碼操作”相關的寄存器都是“只可寫不可讀”的,即WOM(Write-Only-Memory)。因此不要試圖去讀取這些寄存器的內(nèi)容。
3、“密碼操作”的研究及其應用程序開發(fā) 通常,對非接觸式智能卡的“密碼操作”有兩個主要步驟。每一個主要步驟又有若干個小的步驟有序并且必須是連續(xù)地完成。 “密碼操作”的兩個主要步驟是: ●“LOAD_KEY”密碼存取 ●“AUTHENTICATION”密碼認證
3.1“LOAD_KEY”密碼存取 “LOAD_KEY”密碼存取必須由以下步驟有序并連續(xù)地完成: ●設置新的密碼值 ●設置密碼狀態(tài)/控制寄存器KeyStatus&ControlRegister(KEYSTACON) ●設置密碼地址寄存器KeyAddressRegister(寄存器地址:0x0C) ●設置密碼數(shù)據(jù)寄存器KeyDataRegister(寄存器地址:0x0A) ●校驗STACON寄存器,以確定這次的“LOAD_KEY”密碼存取是否有效 以下將按照上述的次序進行具體的程序設計,所有的程序都使用標準的Intel-51MCU指令,以利于讀者在LOW-LEVEL級上移植到其相應的應用項目中。
3.1.1設置新的密碼值 新的密碼值為6個bytes,在如下的程序設計中被依次存放在MCU內(nèi)部RAM的72H~77H的6個單元中;程序員亦可自定義其他的存儲單元作為新的密碼值存放的緩沖區(qū);R1寄存器為新密碼緩存首地址指針。如下所設置新的密碼值為:“AAAAAAAAAAAA” SETUP_NEW_KEY_VALUE: ;MOV R7,#06H;密碼長度為6bytes MOV R1,#72H;R1為新密碼緩存首地址指針 MOV @R1,#0AAH;設置新密碼值 MOV 73H,#0AAH MOV 74H,#0AAH MOV 75H,#0AAH MOV 76H,#0AAH MOV 77H,#0AAH 良好的經(jīng)驗告訴我們,為了確保整個智能卡系統(tǒng)的高度安全保密,我們有必要在程序設計中,在完成了“密碼操作”之后,立即清除存放新的密碼值的緩沖區(qū),簡單的方法如下: CLEAR_NEW_KEY_BUFFER: MOV R7,#06H;密碼長度為6bytes MOV R1,#72H;R1為新密碼緩存首地址指針 CLEAR_LOOP: MOV @R1,#00H;清除新密碼值所在緩沖區(qū) INC R1 DJNZ R7,CLEAR_LOOP
3.1.2設置密碼狀態(tài)/控制寄存器KeyStatus&ControlRegister(KEYSTACON) KEYSTACON寄存器是一個只可讀不可寫的寄存器(存儲器),它指示出“密碼操作”時所處的狀態(tài)和要控制的ASIC內(nèi)部“密碼存儲器RAM”的選擇。這里所指的“狀態(tài)”是指本次“密碼操作”兩個主要步驟中的一個。 KEYSTACON寄存器是一個8-bit的存儲器,其中有用的位(bit)只有3位。其具體內(nèi)容為:
其中,MSB(“A/L”位)若被設置為“0”,則意味著當前“密碼操作”的“狀態(tài)”是“LOAD_KEY(密碼存取)”;若被設置為“1”,則當前“密碼操作”的“狀態(tài)”是“AUTHENTICATION(密碼認證)”。 最后 2個bit:KS0KS1是密碼集keyset的選擇。在ASIC中共有3套密碼集(keyset)和一個傳輸密碼(TransportKey)可被選擇。設置KS0、KS1的值實際上是在選擇(尋址)ASIC模塊內(nèi)部存放密碼的不同的存儲器單元(密碼箱)。如果“LOAD_KEY”(密碼存?。r使用了keyset0,則“AUTHENTICATION”(密碼認證)時只能使用keyset0,而不能使用keyset1或keyset2或其他,因為在ASIC模塊內(nèi),keyset0指定的密碼存儲器地址單元與keyset1或keyset2所指定的密碼存儲器地址單元是不同的單元。這就好比去超級市場購物,入超市前您把您的包裹寄存在超市門前包裹箱A中,并得到打印有開起包裹箱A的(開箱)密碼紙條;當您欲取回包裹時,拿著包裹箱A的(開箱)密碼紙條而去開包裹箱B或C的箱門,當然不能打開,因為您的地址(箱號)不對,當然您的包裹也不能拿到。這是密碼的認證出錯。在ASIC中有相同之處。如果“LOAD_KEY”(密碼存?。r使用了keyset0,并存放上密碼,而在“AUTHENTICATION”(密碼認證)時卻使用keyset1或keyset2或其他而來驗證剛才存放的密碼,當然會得到ASIC模塊返回的認證出錯(“AE=1”)。 當KS1KS0=“00”時,選擇使用keyset0; 當KS1KS0=“01”時,選擇使用keyset1; 當KS1KS0=“10”時,選擇使用keyset2; 當KS1KS0=“11”時,選擇使用傳輸密碼(TransportKey)。 以下是設置密碼狀態(tài)/控制寄存器KeyStatus&ControlRegister(KEYSTACON)的程序: SETUP_KEYSTACON: MOV 7EH,#00000000B;選擇使用keyset0,并指明是“LOAD_KEY” MOV A,7EH ;7EH單元存放了設置KEYSTACON的值 MOV R0,#0BH ;KEYSTACON寄存器地址為0Bh OVX @R0,A ;設置KEYSTACON寄存器 如果我們要選擇使用keyset2,則相應可以設置7EH單元為#00000010b(0x02),即: MOV 7EH,#00000010B
3.1.3設置密碼地址寄存器KeyAddressRegister(寄存器地址:0x0C) 在成功地完成了對密碼狀態(tài)/控制寄存器(KEYSTACON)的設置之后,必須立即對密碼地址寄存器KeyAddressRegister進行設置,而不能對密碼數(shù)據(jù)寄存器KeyDataRegister進行設置或做其他設置,否則將出錯。因為ASIC內(nèi)部接收MCU指令/數(shù)據(jù)的存儲單元是按照FIFO(“FirstInFirstOut”即“先進先出”)方式工作的。 由于一張非接觸式智能卡有16個Sector(扇區(qū)),并且每個Sector都可能有著各自不同的密碼,因此在ASIC模塊中就會有不同的密碼存儲器與之相對應。當對16個Sector中的一個Sector進行密碼操作時,就必須對ASIC模塊中與該Sector對應的密碼存儲器進行尋址,找到這一密碼存儲器確切位置。不過,MCU送出的尋址地址只是ASIC在其內(nèi)部做第二次尋址(地址變化)的“一部分”地址。這里所指的“一部分”是出于高度安全保密的原因。 以下是8位(bit)密碼地址寄存器的說明:
這里, ●MSB(“A/L”bit)與KEYSTACON寄存器中的MSB有著相同的意義; ●“A/B”bit位指出MCU要使用的密碼的類型。當“A/B”=“0”時,MCU使用KEYA;當“A/B”=“1”時,MCU使用KEYB; ●“A5~A0”指出要求密碼操作的某一Sector的地址。當要對Sector0進行密碼操作時,“A5~A0”應該被設置為“00000b”(0x00);如果是Sector1,“A5~A0”應該被設置為“00001b”(0x01);如果是Sector5,“A5~A0”應該被設置為“00101b(0x05),等等。 以下是設置密碼地址寄存器KeyAddressRegister的程序: SETUP_Key_Address_Reg: MOV 7DH,#00000001B ;使用KEYA,對Sector1進行“LOAD_KEY” MOV A,7DH ;7DH單元存儲了密碼地址寄存器值 MOV R0,#0CH ;密碼地址寄存器地址為“0Ch” MOV X@R0,A ;設置密碼地址寄存器 如果要對Sector1使用KEYB,則7DH單元必須設置為“#01000001b”(0x41),即: MOV 7DH,#01000001B 更進一步,如果要對Sector5使用KEYB,則7DH單元必須設置為“#01000101b”(0x45),即: V 7DH,#01000101B 這樣,Sector5中Block0,1,2(相應于絕對塊地址為:Block20,21,22)中原有數(shù)據(jù)將可以被操作。Sector5中Block3也可以按照預先定義的存取控制條件而被改寫密碼,或被讀出密碼或控制字節(jié)。
3.1.4設置密碼數(shù)據(jù)寄存器KeyDataRegister(寄存器地址:0x0A) 如果成功地完成了以上幾個方面的設置,ASIC模塊現(xiàn)在可以接收MCU送出的新的密碼值了,即,現(xiàn)在應該設置密碼數(shù)據(jù)寄存器KeyDataRegister。 密碼數(shù)據(jù)寄存器KeyDataRegister也是WOM類型的存儲器。只可寫入數(shù)據(jù),不可讀出數(shù)據(jù),或讀到的數(shù)據(jù)是無效的。由于密碼的長度為6bytes,因此密碼數(shù)據(jù)寄存器KeyDataRegister也將由6個bytes的FIFO存儲器組成。 以下是設置密碼數(shù)據(jù)寄存器KeyDataRegister的程序: SETUP_Key_Data_Reg: MOV R1,#72H ;R1為新密碼緩存(72H~77H)首地址指針 MOV R7,#06H ;密碼長度=6bytes MOV R0,#0AH ;密碼數(shù)據(jù)寄存器地址為:“0Ah” WRITE_Key_Data_Reg_LOOP: MOV A,@R1 ;取出一個byte的新密碼值 MOV X@R0,A ;將一個byte的新密碼值送入密碼數(shù)據(jù)寄 ;存器中(ASIC模塊中) INC R1 DJNZ R7,WRITE_Key_Data_Reg_LOOP 這里有一個非常重要的問題,即傳送6bytes長度的密碼時,這6bytes的順序必須引起高度重視。 由于每一個Block3都有著如下的存儲格式存放著密碼KEYA,KEYB及4個字節(jié)的存取控制條件:
因此,密碼數(shù)據(jù)寄存器接收MCU發(fā)送的第一個密碼字節(jié)(byte)必須是KEYA中的第一個字節(jié),即表中的“A0”字節(jié)。否則送入非接觸式智能卡中的密碼將是反向的6個字節(jié)。 密碼KEYB具有相同之處。 3.1.5校驗STACON寄存器,以確定這次的“LOAD_KEY”(密碼存取)是否有效 在完成上述操作后,接著應該對以上的結(jié)果進行校驗,以確定這次的“LOAD_KEY”(密碼存取)是否有效。這可以通過校驗STACON寄存器中的“AE”bit位來完成。 STACON寄存器是ASIC模塊中極為重要的狀態(tài)寄存器和控制寄存器。 當對ASIC模塊進行任何讀/寫操作時,它是一個狀態(tài)寄存器,指出當時讀/寫操作的狀態(tài)是如何的。此時的STACON寄存器有著如下的8個bit的狀態(tài)格式:
當對ASIC模塊進行任何控制操作時,它是一個控制寄存器,此時的STACON寄存器又有著如下的8個bit的控制格式:
我們進行密碼操作,讀寫ASIC模塊時,只是會涉及STACON寄存器中的“AuthenticationError”bit(即“AE”位)。 ●當“AE”=“1”時,指明剛才的密碼操作(“LOAD_KEY”或“AUTHENTICATION”)沒有成功; ●當“AE”=“0”時,指明剛才的密碼操作(“LOAD_KEY”或“AUTHENTICATION”)成功; 以下是校驗STACON寄存器,以確定這次“LOAD_KEY”密碼存取操作是否有效的校驗程序: VERIFY_LOAD_KEY_Operationroutine: VERIFY_LOAD_KEY_OP: MOV R0,#01H ;STACON寄存器地址為“01H” MOV XA,@R0 ;讀ASIC內(nèi)的STACON寄存器;如果“AE”=“1”,轉(zhuǎn)出錯處理 JB ACC.2, LOAD_KEY_Operation_ERR ;否則“AE”=“00”,此次“LOAD_KEY”成功 MOV B,#00H;送OK標志“00” AJMP LOAD_KEY_Operation_OK LOAD_KEY_Operation_ERR: MOV B,#99H;送出錯標志“99”,此次“LOAD_KEY”失敗 ...... ?。ǔ鲥e處理) ...... AJMP VERIFY_EXIT LOAD_KEY_Operation_OK: MOV A,B ACALL DISPLAY ...... ?。ā癘K”處理) ...... VERIFY_EXIT: RET
3.2“AUTHENTICATION”(密碼認證) “AUTHENTICATION”(密碼認證)操作必須按照如下的幾個步驟進行: ●設置ASIC模塊中的TOC/BCNTS寄存器等 ●設置密碼狀態(tài)/控制寄存器KeyStatus&ControlRegister(KEYSTACON) ●設置密碼地址寄存器KeyAddressRegister(寄存器地址:0x0C) ●設置AUTHENTICATION指令碼 ●密碼地址變換 ●校驗STACON寄存器,以確定這次的“AUTHENTICATION”密碼認證是否有效 ●關閉TOC及一些其它操作等 由于“AUTHENTICATION”(密碼認證)操作同“LOAD_KEY”(密碼存取)操作相互類似,在此不再重復。 只有在完全完成了上述的兩個主要的密碼操作步驟,并且得當了ASIC模塊“OK”的響應,非接觸式智能卡上相對應與剛才進行過密碼操作的某一扇區(qū)Sectorm內(nèi)的Block0,1,2才能被MCU進行訪問,包括進行讀/寫等數(shù)據(jù)操作。一旦要求對另一扇區(qū)Sectorn內(nèi)的Block進行數(shù)據(jù)讀寫時,則必須重新開始對扇區(qū)Sectorn進行密碼操作,包括“LOAD_KEY”(密碼存取)操作和“AUTHENTICATION”(密碼認證)操作等。
4、結(jié)束語 非接觸式智能卡技術雖然至今只有4~5年的成熟發(fā)展期,但是由于它的高度保密性,以及使用的方便性,得到了很快的普及。這種普及又加速了非接觸式智能卡技術的飛躍發(fā)展。它同銀行用接觸式CPU卡相互融合,產(chǎn)生了新的雙界面智能卡(Contact&ContactlessInterface),在e-purse電子錢包系統(tǒng)等方面取得到了很大的成功。世界上一些著名的大公司,如SONY公司等,也介入了非接觸式智能卡技術領域,并且SONY的非接觸式智能卡技術又有著非常獨到之處。根據(jù)筆者對SONY非接觸式智能卡技術的使用、研究和了解,相對MIFARE而言,其在讀卡的速度、穩(wěn)定性、誤碼率等性能上都有很大的提高,這也是其溶入了新的技術所致。
|