- 容量為8K位EEPROM(Electrically Erasable Programmable Read-Only Memory,帶電可擦可編程只讀存儲器)
- 分為16個扇區,每個扇區為4塊,每塊16個字節,以塊為存取單位
- 每個扇區有獨立的一組密碼及訪問控制
- 每張卡有唯一序列號,為32位
- 具有防沖突機制,支持多卡操作
- 無電源,自帶天線,內含加密控制邏輯和通訊邏輯電路
- 數據保存期為10年,可改寫10萬次,讀無限次
- 工作溫度:-20℃~50℃(溫度為90%)
- 工作頻率:13.56MHZ
- 通信速率:106KBPS
- 讀寫距離:10mm以內(與讀寫器有關)
1、M1卡分為16個扇區,每個扇區4塊(塊0~3),共64塊,按塊號編址為0~63。第0扇區的塊0(即絕對地址0塊)用於存放廠商代碼,已經固化,不可更改。其他各扇區的塊0、塊1、塊2為數據塊,用於存貯數據;塊3為控制塊,存放密碼A、存取控制、密碼B。每個扇區的密碼和存取控制都是獨立的,可以根據實際需要設定各自的密碼及存取控制。存貯結構如下表所示:
|
|
塊0
|
IC卡廠家信息
|
數據塊
|
0
|
|
扇區0
|
塊1
|
|
數據塊
|
1
|
|
|
塊2
|
|
數據塊
|
2
|
|
|
塊3
|
密碼A 存取控制 密碼B
|
控制塊
|
3
|
|
塊0
|
|
數據塊
|
4
|
|
|
扇區1
|
塊1
|
|
數據塊
|
5
|
|
|
塊2
|
|
數據塊
|
6
|
|
|
塊3
|
密碼A 存取控制 密碼B
|
控制塊
|
7
|
|
|
|
∶
∶
∶
|
|
|
|
0
|
|
數據塊
|
60
|
|
|
扇區15
|
1
|
|
數據塊
|
61
|
|
|
2
|
|
數據塊
|
62
|
|
|
3
|
密碼A 存取控制 密碼B
|
控制塊
|
63
|
3、每個扇區的塊0、塊1、塊2為數據塊,可用於存貯數據。
數據塊可作兩種應用:
用作一般的數據保存,可以進行讀、寫操作。
用作數據值,可以進行初始化值、加值、減值、讀值操作。
4、每個扇區的塊3為控制塊,包括了密碼A、存取控制、密碼B。具體結構如下:
| 各區控制塊3 結構 | 字節號 | 0 1 2 3 4 5 | 6 7 8 9 | 10 11 12 13 14 15 |
| 控制值 | FF FF FF FF FF FF | FF 07 80 69 | FF FF FF FF FF FF | |
| 說明 | 密碼A(0~5字節) | 存取控制(6~9字節) | 密碼B(10~15字節) |
密碼A(6字節) 存取控制(4字節) 密碼B(6字節)
5、每個扇區的密碼和存取控制都是獨立的,可以根據實際需要設定各自的密碼及存取控制。存取控制為4個字節,共32位,扇區中的每個塊(包括數據塊和控制塊)的存取條件是由密碼和存取控制共同決定的,在存取控制中每個塊都有相應的三個控制位,定義如下:
表:控制位定義"CXxy" (x=0~15扇區; y=塊0,塊1,塊2)
| 塊0 | C1x0 | C2x0 | C3x0 | 用戶數據塊,(0區0塊除外) |
| 塊1 | C1x1 | C2x1 | C3x1 | 用戶數據塊 |
| 塊2 | C1x2 | C2x2 | C3x2 | 用戶數據塊 |
| 塊3 | C1x3 | C2x3 | C3x3 | 密匙存取控制塊 |
例如C1x0中的C代碼這是控制位,1代表第一位,0代表是塊0的控制位。
三個控制位以正和反兩種形式存在於存取控制字節中,決定了該塊的訪問權限(如進行減值操作必須驗證KEY A,進行加值操作必須驗證KEY B,等等)。三個控制位在存取控制字節中的位置
表:三個控制位在存取控制字節中的位置(注:" _b" 表示取反)
| 字節號 | 位號 | bit 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 字節6 | C2x3_b | C2x2_b | C2x1_b | C2x0_b | C1x3_b | C1x2_b | C1x1_b | C1x0_b |
| 字節7 | C1x3 | C1x2 | C1x1 | C1x0 | C3x3_b | C3x2_b | C3x1_b | C3x0_b |
| 字節8 | C3x3 | C3x2 | C3x1 | C3x0 | C2x3 | C2x2 | C2x1 | C2x0 |
| 字節9 | BX7 | BX6 | BX5 | BX4 | BX3 | BX2 | BX1 | BX0 |
| 所屬塊 | 塊3控制位 | 塊2控制位 | 塊1控制位 | 塊0控制位 | 塊3控制位 | 塊2控制位 | 塊1控制位 | 塊0控制位 |
以塊0為例,對塊0的控制:
| bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| 字節6 |
|
|
|
C20_b |
|
|
|
C10_b |
| 字節7 |
|
|
|
C10 |
|
|
|
C30_b |
| 字節8 |
|
|
|
C30 |
|
|
|
C20 |
| 字節9 |
|
|
|
|
|
|
|
|
( 注: C10_b表示C10取反 )
存取控制(4字節,其中字節9為備用字節)結構如下所示:
| bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| 字節6 |
C23_b |
C22_b |
C21_b |
C20_b |
C13_b |
C12_b |
C11_b |
C10_b |
| 字節7 |
C13 |
C12 |
C11 |
C10 |
C33_b |
C32_b |
C31_b |
C30_b |
| 字節8 |
C33 |
C32 |
C31 |
C30 |
C23 |
C22 |
C21 |
C20 |
| 字節9 |
|
|
|
|
|
|
|
|
( 注: _b表示取反 )
6、數據塊(塊0、塊1、塊2)的存取控制如下:
| 控制位(X=0..2)
|
訪 問 條 件 (對數據塊 0、1、2) |
|||||
| C1X |
C2X |
C3X |
Read |
Write |
Increment |
Decrement, transfer, Restore |
| 0 |
0 |
0 |
KeyA|B |
KeyA|B |
KeyA|B |
KeyA|B |
| 0 |
1 |
0 |
KeyA|B |
Never |
Never |
Never |
| 1 |
0 |
0 |
KeyA|B |
KeyB |
Never |
Never |
| 1 |
1 |
0 |
KeyA|B |
KeyB |
KeyB |
KeyA|B |
| 0 |
0 |
1 |
KeyA|B |
Never |
Never |
KeyA|B |
| 0 |
1 |
1 |
KeyB |
KeyB |
Never |
Never |
| 1 |
0 |
1 |
KeyB |
Never |
Never |
Never |
| 1 |
1 |
1 |
Never |
Never |
Never |
Never |
(KeyA|B 表示密碼A或密碼B,Never表示任何條件下不能實現)
例如:當塊0的存取控制位C10 C20 C30=1 0 0時,驗證密碼A或密碼B正確后可讀;驗證密碼B正確后可寫;不能進行加值、減值操作。
7、控制塊(塊3)的存取控制與數據塊(塊0、1、2)不同,它的存取控制如下:
|
|
|
|
密碼A |
存取控制 |
密碼B |
|||
| C13 |
C23 |
C33 |
Read |
Write |
Read |
Write |
Read |
Write |
| 0 |
0 |
0 |
Never |
KeyA|B |
KeyA|B |
Never |
KeyA|B |
KeyA|B |
| 0 |
1 |
0 |
Never |
Never |
KeyA|B |
Never |
KeyA|B |
Never |
| 1 |
0 |
0 |
Never |
KeyB |
KeyA|B |
Never |
Never |
KeyB |
| 1 |
1 |
0 |
Never |
Never |
KeyA|B |
Never |
Never |
Never |
| 0 |
0 |
1 |
Never |
KeyA|B |
KeyA|B |
KeyA|B |
KeyA|B |
KeyA|B |
| 0 |
1 |
1 |
Never |
KeyB |
KeyA|B |
KeyB |
Never |
KeyB |
| 1 |
0 |
1 |
Never |
Never |
KeyA|B |
KeyB |
Never |
Never |
| 1 |
1 |
1 |
Never |
Never |
KeyA|B |
Never |
Never |
Never |
例如:當塊3的存取控制位C13 C23 C33=1 0 0時,表示:
密碼A: 不可讀,驗證KEYB正確后可寫(更改)。
存取控制:不可寫,驗證KEYA或KEYB正確后可讀。
密碼B: 不可讀,驗證KEYB正確后可寫。
卡片的電氣部分只由一個天線和ASIC(Application Specific Integrated Circuit)組成。
天線:卡片的天線是只有幾組繞線的線圈,很適於封裝到IS0卡片中。
ASIC:卡片的ASIC由一個高速(106KB波特率)的RF接口,一個控制單元和一個8K位EEPROM(Electrically Erasable Programmable Read-Only Memory,帶電可擦可編程只讀存儲器)組成。
工作原理:讀寫器向M1卡發一組固定頻率的電磁波,卡片內有一個LC串聯諧振電路,其頻率與訊寫器發射的頻率相同,在電磁波的激勵下,LC諧振電路產生共振,從而使電容內有了電荷,在這個電容的另一端,接有一個單向導通的電子泵,將電容內的電荷送到另一個電容內儲存,當所積累的電荷達到2V時,此電容可做為電源為其它電路提供工作電壓,將卡內數據發射出去或接取讀寫器的數據。

M1射頻卡的通訊協議和通訊波特率是定義好的,當有卡片進入讀寫器的操作范圍時,讀寫器以特定的協議與它通訊,從而確定該卡是否為M1射頻卡,即驗證卡片的卡型。
防沖突機制 (Anticollision Loop)
當有多張卡進入讀寫器操作范圍時,防沖突機制會從其中選擇一張進行操作,未選中的則處於空閑模式等待下一次選卡,該過程會返回被選卡的序列號。
選擇被選中的卡的序列號,並同時返回卡的容量代碼。
選定要處理的卡片之后,讀寫器就確定要訪問的扇區號,並對該扇區密碼進行密碼校驗,在三次相互認證之后就可以通過加密流進行通訊。(在選擇另一扇區時,則必須進行另一扇區密碼校驗。)
讀 (Read):讀一個塊;
寫 (Write):寫一個塊;
加(Increment):對數值塊進行加值;
減(Decrement):對數值塊進行減值;
存儲(Restore):將塊中的內容存到數據寄存器中;
傳輸(Transfer):將數據寄存器中的內容寫入塊中;
中止(Halt):將卡置於暫停工作狀態;
連接讀寫器→尋卡→識別卡(獲取卡序列號)→從多卡中選一張卡→向卡中緩沖區裝載密碼→驗證密碼→進行讀寫→關閉連接
即(代碼說明)
Open_USB→rf_request→rf_anticoll→rf_select→rf_load_key→rf_authentication→(/a_hex)→rf_read/rf_write→(hex_a)→Close_USB
如果概括來說的話,主要也就四部分:開關連接、尋卡、驗證密碼、讀取。
基本操作規則
(1)程序開始,調用rf_init函數初始化串口。
(2)尋卡,調用rf_card;
相當於連續調用三個函數:
rf_request
rf_anticoll
rf_select
注:調用高級函數對卡進行操作時,無需此步驟。
(3)對單個扇區操作,順次執行A~D;
對多個扇區操作,循環執行A~E;
A、選定要操作的扇區;
B、裝載密碼,調用rf_load_key;
C、驗證密碼,調用rf_authentication;
D、進行操作,包括讀寫及值操作。
E、調用rf_halt。
(4)關閉串口,調用rf_exit。程序正常退出或因錯誤退出之前,要使用函數;否則再次執行初始化串口時將出錯。
1.尋卡模式:
尋卡模式分三種情況:IDLE模式、ALL模式及指定卡模式(0,1,2 均是int類型,是方法參數,下同)。
0——表示IDLE模式,一次只對一張卡操作;
1——表示ALL模式,一次可對多張卡操作;
2——表示指定卡模式,只對序列號等於snr的卡操作(高級函數才有)【不常用】
也就是說,我們一次也可以同時操作多張卡。
對於多卡操作,其實際真正執行操作的還是一張卡。讀寫器能識別多張卡的序列號(但注意識別出的順序是不定的,並且最多也就能識別4張卡,因為卡疊放的厚度太厚,會超出讀寫器的識別范圍),並一一進行操作。
所以由此看出,多卡操作的意義並不大。但我建議大家還是設置為1好了。
2.密碼驗證模式:
0——KEYSET0的KEYA
4——KEYSET0的KEYB
M1卡可以在驗證密碼時選擇密碼類型(A/B)。【其實M1卡有3套密碼(KEYSET0、KEYSET1、KEYSET2),共6個密碼(用0~2、4~6來表示這六個密碼),目的是為了適應不同讀寫器。而這里我們用的是KEYSET0的2個密碼】
這可以說是M1卡的精髓了,也是M1卡最為復雜的地方,希望大家耐心看完。
(請先看明白M1卡結構)如上所說,在存取控制中每個塊都有相應的三個控制位,它們的定義如下:
塊0: C10 C20 C30
塊1: C11 C21 C31
塊2: C12 C22 C32
塊3: C13 C23 C33
一個扇區的三個數據塊,我們可以利用密碼機制對它們分別進行權限控制。數據塊(塊0、塊1、塊2)的存取控制如下:

例如:當塊0的存取控制位C10 C20 C30=100時,驗證密碼A或密碼B正確后可讀;驗證密碼B正確后可寫;不能進行加值、減值操作。
那么M1卡修改密碼的方法是rf_changeb3
參數:
icdev:通訊設備標識符
_SecNr:扇區號(0~15)
_KeyA:密碼A
_B0:塊0控制字,低3位(D2D1D0)對應C10、C20、C30
_B1:塊1控制字,低3位(D2D1D0)對應C11、C21、C31
_B2:塊2控制字,低3位(D2D1D0)對應C12、C22、C32
_B3:塊3控制字,低3位(D2D1D0)對應C13、C23、C33
_Bk:保留參數,取值為0
_KeyB:密碼B
返 回:成功則返回 0
由上我們看出_B0、_B1、_B2、_B3分別控制塊0、塊1、塊2、塊3。
由圖我們可知_B0、_B1、_B2的可取值為 0、10、100、110、1、11、101、111。
這里大家一定要注意一點:
不能裝載密碼到M1卡某一扇區后再更改那扇區的密碼(最好連接完讀寫器后直接更改密碼),否則更改密碼會失敗而凍結扇區。如果不慎這樣了,解決的辦法是完成一次讀寫操作,再更改密碼。
控制塊(塊3)的存取控制與數據塊(塊0、1、2)不同,它的存取控制如下:

_B3的取值與_B0相同。
KeyA=A0、A1、A2、A3、A4、A5
控制塊=FF、07、80、69
KeyB=B0、B1、B2、B3、B4、B5
| 字節 | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | 權限 | 二進制 |
| Byte6 | C2X3_b | C2X2_b | C2X1_b | C2X0_b | C1X3_b | C1X2_b | C1X1_b | C1X0_b | FF | 1 1 1 1 1 1 1 1 |
| Byte 7 | C1X3 | C1X2 | C1X1 | C1X0 | C3X3_b | C3X2_b | C3X1_b | C3X0_b | 07 | 0 0 0 0 0 1 1 1 |
| Byte 8 | C3X3 | C3X2 | C3X1 | C3X0 | C2X3 | C2X2 | C2X1 | C2X0 | 80 | 1 0 0 0 0 0 0 0 |
| Byte 9 | BX7 | BX6 | BX5 | BX4 | BX3 | BX2 | BX1 | BX0 | 69 | 0 1 1 0 1 0 0 1 |
得出存取控制位如下:
| 塊0 | C1X0 | C2X0 | C3X0 | 0 0 0 |
| 塊1 | C1X1 | C2X1 | C3X1 | 0 0 0 |
| 塊2 | C1X2 | C2X2 | C3X2 | 0 0 0 |
| 塊3 | C1X3 | C2X3 | C3X3 | 0 0 1 |
控制塊=08、77、8F、00
KeyB=B0、B1、B2、B3、B4、B5
| 字節 | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | 權限 | 二進制 |
| Byte 6 | C2X3_b | C2X2_b | C2X1_b | C2X0_b | C1X3_b | C1X2_b | C1X1_b | C1X0_b | 08 | 0 0 0 0 1 0 0 0 |
| Byte 7 | C1X3 | C1X2 | C1X1 | C1X0 | C3X3_b | C3X2_b | C3X1_b | C3X0_b | 77 | 0 1 1 1 0 1 1 1 |
| Byte 8 | C3X3 | C3X2 | C3X1 | C3X0 | C2X3 | C2X2 | C2X1 | C2X0 | 8F | 1 0 0 0 1 1 1 1 |
| Byte 9 | BX7 | BX6 | BX5 | BX4 | BX3 | BX2 | BX1 | BX0 | 00 | 0 0 0 0 0 0 0 0 |
得出存取控制位如下:
| 塊0 | C1X0 | C2X0 | C3X0 | 1 1 0 |
| 塊1 | C1X1 | C2X1 | C3X1 | 1 1 0 |
| 塊2 | C1X2 | C2X2 | C3X2 | 1 1 0 |
| 塊3 | C1X3 | C2X3 | C3X3 | 0 1 1 |
快速識別EM卡,HID卡和MF卡
MF1卡常見問題及處理建議:
- ① 盲目操作:造成某些區塊誤操作被鎖死不能再使用。應當仔細參考表3表5的控制權限后,予先得出操作后的結果是否適合使用要求,並且列出操作順序表單再操作。最好授權程序員對塊3的設置作專人操作。
- ② 丟失密碼:再讀寫時造成密碼認證出錯而不能訪問卡。特別要求在對MF卡進行塊3編程操作時,必須及時記錄相關卡號的控制值,KeyA,KeyB等,而且應當有專人管理密碼檔案。
- ③ 錯誤設置:對MF1卡的塊3控制塊了解不透徹,錯誤的理解造成設置造成錯誤的設置。依照表2可知,目前Mf1卡的控制塊僅只有8種數據塊訪問控制權限和8種控制塊設置權限,超出這16種權限的其他代碼組合,將直接引起錯誤設置而使卡片報廢!
- ④ 極端權限:當塊3的存取控制位C13 C23 C33 = 110或者111時,稱為極端權限。除特殊應用外一般不被使用!啟用前認真權衡對密碼讀寫,存取控制的鎖死是否必要,否則,數據加密后即使有密碼也無法讀取被鎖死的數據區塊(看不見)!
- ⑤ 設備低劣:低劣的設備將直接影響卡的讀寫性能。對MF卡進行塊3編程操作的設備,特別要求其性能必須十分可靠,運行十分穩定!建議選用由飛利浦公司原裝讀寫模塊構建的知名讀寫機具!
- ⑥ 編程干擾:在對塊3進行編程操作時,不可以有任何的‘IO‘中斷或打擾!包括同時運行兩個以上程序干擾甚至PC機不良的開關電源紋波干擾等,否則,不成功的寫操作將造成某個扇區被鎖死的現象,致使該扇區再次訪問時出錯而報廢。
- ⑦ 數據出錯:在臨界距離點上讀卡和寫卡造成的。通常的讀卡,特別是寫卡,應該避免在臨界狀態(剛能讀卡的距離)讀卡。因為臨界狀態下的數據傳送是很不穩定的!容易引起讀寫出錯!
- ⑧ 人為失誤:例如,密碼加載操作失誤,誤將KeyA加載為KeyB;或者是誤將其他制卡廠約定的初始密碼值如a0a1a2a3a4a5,b0b1b2b3b4b5加載到本公司生產的MF1卡內;或者在初始狀態下(密碼A=000000000000【隱藏狀態,實際為ffffffffffff】,控制位=FF 07 80 69,密碼B=ffffffffffff【可見】)若不經意地將KeyA=000000000000 刪除后又重新輸入12個‘0‘,並加載了它!這時無意中已將KeyA原來12個隱藏的‘f‘,修改成了12個‘0‘,其后果可想而知!
- ⑨ 卡片失效:讀寫均無數據傳送,讀寫器報告‘尋卡錯誤‘!卡片被超標扭曲,彎曲而造成內電路斷裂。
- ⑩ 讀寫距離過近:與用戶使用的讀寫器性能有關。標准型MF1卡的讀寫距離可達10cm(在飛利浦公司的標准讀寫機具上測試的最大距離),國產知名品牌讀寫器一般可達5-10cm。尺寸較小的匙扣卡,其讀寫距離當然比標准卡近許多,但只要可靠的讀寫距離≥5~10mm以上,一般不會影響正常使用!
