Mifare S50與S70的存取控制


 存取控制指符合什麼條件才能對卡片進行操作。

    S50和S70的塊分爲數據塊和控制塊,對數據塊的操作有“讀”、“寫”、“加值”、“減值(含傳輸和存儲)”四種,對控制塊的操作只有“讀”和“寫”兩種。

    S50和S70的每個扇區有兩組密碼KeyA和KeyB,所謂的“條件”就是針對這兩組密碼而言,包括“驗證密碼A可以操作(KeyA)”、“驗證密碼B可以操作(KeyB)”、“驗證密碼A或密碼B都可以操作(KeyA|B)”、“驗證哪個密碼都不可以操作(Never)”四種條件。

    這些“條件”和“操作”的組合被分成8種情況,正好可以用3位二進制數(C1、C2、C3)來表示。

    數據塊(每個扇區除區尾塊之外的塊)的存取控制如下表所示:

 

  控制位

         訪 問 條 件 (驗證哪個密碼)

C1

C2

C3

 讀

 寫

加值

減值(含傳輸和存儲)

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

    從表中可以看出,

    C1C2C3=000(出廠默認值)時最寬鬆,驗證密碼A或密碼B後可以進行任何操作;

    C1C2C3=111無論驗證哪個密碼都不能進行任何操作,相當於把對應的塊凍結了;

    C1C2C3=010和C1C2C3=101都是隻讀,如果對應的數據塊寫入的是一些可以給人看但不能改的基本信息,可以設爲這兩種模式;

    C1C2C3=001時只能讀和減值,電子錢包一般設爲這種模式,比如用S50做的公交電子車票,用戶只能查詢或扣錢,不能加錢,充值的時候先改變控制位使卡片可以充值,充完值再改回來。

 

    控制塊(每個扇區的區尾塊)的存取控制如下表所示:

 

控制位

密碼A

存取控制

密碼B

C1

C2

C3

0

0

0

Never

KeyA

KeyA

Never

KeyA

KeyA

0

1

0

Never

Never

KeyA

Never

KeyA

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

KeyA

KeyA

KeyA

KeyA

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

    從表中可以看出,

    密碼A是永遠也讀不出來的,如果用戶的數據塊指定了驗證密碼A卻忘了密碼A,也就意味着這個數據塊作廢了,但本扇區其他數據塊和其他扇區的數據塊不受影響;

    存取控制總是可以讀出來的,只要別忘了密碼A或密碼B;

    存取控制的寫控制在設置時一定要小心,一旦弄成了“Never”,則整個扇區的存取條件再也無法改變,後悔都找不到地方,只能仰天長嘆了;

    C1C2C3=001(出廠默認值)時最寬鬆,除了密碼A不能讀之外,驗證了密碼A其他讀寫操作都可以進行;

    還有一個有意思的現象是當C1C2C3=000、C1C2C3=010和C1C2C3=001時,所有的操作都不使用密碼B,這時候密碼B佔據的6個字節可以提供給用戶作爲普通數據存儲用,相當於每個扇區增加了6字節的用戶可用存儲容量。

    由於卡片出廠的默認值C1C2C3=001,所以對於新買來的卡片,不要使用密碼B進行認證,否則會導致區尾塊和數據塊都無法進行任何操作。我測試過不同廠家的新卡片,有的驗證密碼B後確實扇區內的所有塊都無法操作,但有的卡片不能操作區尾塊,卻可以操作數據塊,本文以NXP的原裝卡爲準。當然用戶可以放心,新卡不讓你驗證密碼B而你卻驗證了,不會對卡照成什麼傷害,改回用密碼A驗證,卡片還是可以正常使用的。

    S50的每個扇區有4個塊,這四個塊的存取控制是相互獨立的,每個塊需要3個bit,四個塊共使用12個bit。在保存的時候,爲了防止控制位出錯,同時保存了這12個bit的反碼,這樣一個區的存儲控制位在保存時共佔用24bit的空間,正好是3個字節。我們前面說存取控制字有四個字節(區尾塊的Byte6~Byte9),實際上只使用的Byte6、Byte7和Byte8,Byte9沒有用,用戶可以把Byte9作爲普通存儲空間使用。各塊控制位存儲格式如下:

 

 

 

塊3(區尾塊)

塊2

塊1

塊0

Byte6

b3  b2  b1  b0

塊3-C1-反

塊2-C1-反

塊1- C1-反

塊0-C1-反

b7  b6  b5  b4

塊3-C2-反

塊2-C2-反

塊1- C2-反

塊0-C2-反

Byte7

b3  b2  b1  b0

塊3-C3-反

塊2-C3-反

塊1- C3-反

塊0-C3-反

b7  b6  b5  b4

塊3-C1

塊2-C1

塊1- C1

塊0-C1

Byte8

b3  b2  b1  b0

塊3-C2

塊2-C2

塊1- C2

塊0-C2

b7  b6  b5  b4

塊3-C3

塊2-C3

塊1- C3

塊0-C3

    由於出廠時數據塊控制位的默認值是C1C2C3=000,控制塊的默認值是C1C2C3=001,而Byte9一般是69H,所以出廠白卡的控制字通常是FF078069H.

    S70的前32個數據塊結構和S50完全一致。後8個數據塊每塊有15個普通數據塊和一個控制塊。顯然如果每個數據塊塊單獨控制將需要8字節的控制字,控制塊中放不下這麼多控制字。解決的辦法是這15個數據塊分爲三組,塊0~4爲第一組,塊5~9爲第二組,塊10~15爲第三組,每組共享三個控制位,也就是說每組控制位C1C2C3控制5個數據塊的存取權限,從而與前32個扇區兼容。


發佈了30 篇原創文章 · 獲贊 54 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章