存取控制指符合什麼條件才能對卡片進行操做。測試
S50和S70的塊分爲數據塊和控制塊,對數據塊的操做有「讀」、「寫」、「加值」、「減值(含傳輸和存儲)」四種,對控制塊的操做只有「讀」和「寫」兩種。spa
S50和S70的每一個扇區有兩組密碼KeyA和KeyB,所謂的「條件」就是針對這兩組密碼而言,包括「驗證密碼A能夠操做(KeyA)」、「驗證密碼B能夠操做(KeyB)」、「驗證密碼A或密碼B均可以操做(KeyA|B)」、「驗證哪一個密碼都不能夠操做(Never)」四種條件。ci
這些「條件」和「操做」的組合被分紅8種狀況,正好能夠用3位二進制數(C一、C二、C3)來表示。it
數據塊(每一個扇區除區尾塊以外的塊)的存取控制以下表所示:table
控制位權限 |
訪 問 條 件 (驗證哪一個密碼)二進制 |
|||||
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),實際上只使用的Byte六、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個扇區兼容。