M1卡介紹


本文整理自網絡。

 

 

M1卡是指菲利浦下屬子公司恩智浦出品的芯片縮寫,全稱為NXP Mifare1系列,常用的有S50及S70兩種型號,目前都有國產芯片與其兼容,屬於非接觸式IC卡。最為重要的優點是可讀可寫並且安全性高的多功能卡。這些優點與其自身的結構密不可分。
 
主要指標
  • 容量為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

 

2、第0扇區的塊0(即絕對地址0塊),它用於存放廠商代碼,已經固化,不可更改。

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時,此電容可做為電源為其它電路提供工作電壓,將卡內數據發射出去或接取讀寫器的數據。

 

復位應答(Answer to request)

M1射頻卡的通訊協議和通訊波特率是定義好的,當有卡片進入讀寫器的操作范圍時,讀寫器以特定的協議與它通訊,從而確定該卡是否為M1射頻卡,即驗證卡片的卡型。

 

防沖突機制 (Anticollision Loop)

當有多張卡進入讀寫器操作范圍時,防沖突機制會從其中選擇一張進行操作,未選中的則處於空閑模式等待下一次選卡,該過程會返回被選卡的序列號。

 

選擇卡片(Select Tag)

選擇被選中的卡的序列號,並同時返回卡的容量代碼。

 

三次互相確認(3 Pass Authentication)

選定要處理的卡片之后,讀寫器就確定要訪問的扇區號,並對該扇區密碼進行密碼校驗,在三次相互認證之后就可以通過加密流進行通訊。(在選擇另一扇區時,則必須進行另一扇區密碼校驗。)

 

對數據塊的操作

讀 (Read):讀一個塊;

寫 (Write):寫一個塊;

加(Increment):對數值塊進行加值;

減(Decrement):對數值塊進行減值;

存儲(Restore):將塊中的內容存到數據寄存器中;

傳輸(Transfer):將數據寄存器中的內容寫入塊中;

中止(Halt):將卡置於暫停工作狀態;

 

 

M1卡運作機理

連接讀寫器→尋卡→識別卡(獲取卡序列號)→從多卡中選一張卡→向卡中緩沖區裝載密碼→驗證密碼→進行讀寫→關閉連接

即(代碼說明)

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。程序正常退出或因錯誤退出之前,要使用函數;否則再次執行初始化串口時將出錯。

 

M1卡功能模式

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卡最為復雜的地方,希望大家耐心看完。

(請先看明白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相同。

 

存取控制舉例
例1:塊3的初始化值為:
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
 
例2:塊3的初始化值為:
KeyA=A0、A1、A2、A3、A4、A5
控制塊=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



M1卡使用注意事項

快速識別EM卡,HID卡和MF卡

如果是一面平,一面代坡並且底面有一排數字的為EM卡,剩下兩張應該是平的,其中一張應該是另一張的二倍厚,那么厚的那張是HID卡,薄的是MF卡。 M1卡寫數據是直接向控制塊里寫,但能寫的前提是扇區的密碼已得到確認.向控制塊中寫數據時,首先要理解控制塊中控制位的用途.避免寫入無效數據后,扇區被鎖死。 每個控制塊共16個字節,前6個和后6個字節是密碼KeyA和KeyB,中間4個字節是控制位.如果寫錯控制位,即使你知道KeyA/KeyB,也再也不能訪問這個扇區了。
 
所謂三次互相認證是只在進行真正的數據交換前,卡和讀寫器之間會傳輸一些隨機產生的密鑰,在確認這一次通訊的密鑰后,真正的數據才會使用這些密鑰加密后進行通訊.密鑰產生過程就是三次認證.由於每一次密鑰不同,所以即使是進行相同數據的通訊,在卡和讀卡器之間的每次通訊信號都是不同的,沒法捕捉。這三次認證跟密鑰KEYA或KEYB是有關的。的確需要事先設定讀卡機和卡片的密鑰一致才能認證。認證時通過隨機數和KEYA或KEYB產生一個后續通信需要的流加密種子,當然讀卡機和卡片的加密算法和該種子需保持一致。
 

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以上,一般不會影響正常使用!
 
 
 
 
 
實際應用
 
M1 卡的格式化方法:
例如,M1 卡的某一扇區的塊3數據為:
KEYA:FFFFFFFFFFFF
控制值:FF078069
KEYB:FFFFFFFFFFFF
 
現要格式化卡(假如驗證密碼A)為:
KEYA 輸入 FFFFFFFFFFFF
KEYB 輸入 123456781234
則可以格式化
 
KEYA 輸入 123456781234
KEYB 輸入 FFFFFFFFFFFF
也可以格式化
即先用輸入的KEYA與卡中控制塊的KEYA比較,驗證失敗再用輸入的KEYB與卡中控制塊的KEYB比較,驗證失敗則失敗,否則成功。
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM