2012年12月21日 星期五

小玩 NFC近場通訊 (Near Field Communication)

 
NFC 是近幾年滿熱門的一個詞彙,全名叫做近場通訊 (Near Field Communication),大家常用的悠遊卡的技術就被包含在其中。NFC 之所以受到矚目,主要在於手機內建 NFC 晶片後,未來與行動支付結合的商業潛力。

NFC 納入了之前的非接觸式晶片卡的規格、包括 ISO14443 的 Type A (MIFARE)、Type B,以及由 Sony 研發的 FeliCa(曾申請成為 ISO 規格的 Type 3 但失敗)。統合了近場通訊的規格後,業者們也紛紛成立各種聯盟來推廣應用,譬如台灣的悠遊卡與五大電信公司就共同成立信託服務管理(TSM),催生 NFC 的小額交易與應用;開南大學也成立行動商務研發營運中心,與各廠商合作。(關於行動支付,可參考這篇:Google 開了行動支付的第一槍:Google Wallet

而被納入 NFC 的 FeliCa,也有一些有趣的故事,這在日經的網站上有刊載(請見參考資料),看完開發故事也不禁讓人敬佩努力不懈的精神及必定要成功的毅力。在這裡分享一些有趣的資料給讀者,譬如說:
  • Sony 原本是要開發用於快遞包裹自動分揀的感應晶片。
  • 至於車票,Sony 一開始想開發的,是希望卡片帶在身上就可以直接通過閘門,不用拿出來感應的形式。
  • 一開始開發的是使用 2.4 GHz 頻段,後來改成 32 MHz,最後是(現行的) 13.56 MHz。
  • 本來是要內建電池的,Sony 也有超薄電池技術。開發到一半改成無電池,整個設計大翻修。記憶體從 SRAM 改成 EEPROM,CPU 晶片也從通用的改成專屬,通訊載波改成 13.56 MHz(可傳輸電力)。
  • 感應的平面傾斜 13 度是經過實驗證實是通過錯誤率最低的(あらためてSuicaの話でもしようか,山中俊治)。這個角度讓使用者自然地 “Touch & Go”,並延長通訊時間(日經的報導中詳述了更多技術細節)。
  • 為了滿足 JR 所提出的需求(閘門每分鐘能通過 60 人),FeliCa 採用了各種方法以縮短處理時間,譬如如何快速寫入資料,將各個區域的金鑰合成為「縮退鍵」(日文)以節省認證時間等。去過日本的讀者可以比較看看日本鐵路與台北捷運使用感應卡通過閘門的速度(Automatic ticket gates keep screaming 新宿駅叫び続ける自動改札機,可觀察旅客前進的速度以及感應卡貼近的時間長度)。當然這也牽涉到很多因素,譬如台北捷運的旅客有不少會停在那裡等感應完成再通過,可能是怕感應失敗過不去,或者跟感應處與閘門的距離有些關連,且顯示資訊的螢幕位置就在刷卡位置旁,而日本是在更前方的位置,繼續前進時就能正好看到(又譬如台鐵的背磁式車票就是用日本的閘門,車票放入後繼續往前走,到更前面的地方抽出來,而高鐵的就不是這樣設計)。
  • 當時 JR 採用 FeliCa 時,FeliCa 尚未被採納為國際標準,外商就此提出告訴(是關於《政府採購協議》的規範)。
可見某樣東西之所以會設計成某個樣子,背後都是有其理由的。

小玩 NFC

NFC 大廠 NXP 有提供 Android 程式 TagInfo,能查看 MIFARE 與 FeliCa 等感應卡的內容,來玩玩看吧。

SUICA

首先拿筆者手上的 JR 東日本的 SUICA 來試試看(在設定中將 scan level 改用 full scan)。

掃描後可以看到下方列出了交易以及金額,這是怎麼做到的呢?我們將 tab 切到 TECH 來看看。

在 Memory content 的地方,看到有一區寫著 Suica log,這裡就記載著最近 20 筆交易的詳細內容,包括車站代碼、交易金額等,利用這些資料,就能解析出交易內容。雖然這些代碼沒有免費公開,但日本網友已經收集完了,譬如 SUICA 的。

因此就有 Suica Reader 或 FareBot 這種軟體,可以幫你直接解析內容(FareBot 還支援其他國家的其他卡)。

八達通卡

之前也有人寫了非官方的香港八達通卡餘額閱讀器,還引起軒然大波,但其實餘額資訊是存放在未加密區,而我們也沒有寫入資料所需的金鑰,根本與破解無關(卡片內的各個區域可以分開設定讀寫權限)。以筆者的八達通卡為例,以民間與官方的八達通查閱易皆顯示餘額為 25.5(上為官方版,下為民間版)。


那麼這資料是儲存在哪裡呢?我們一樣使用 TagInfo 查看,可看到有一區段叫做 [Octopus value] (Read Only)。

最前面四個位元組 (00 00 02 5D,相當於十進位的 605) 就是餘額的資訊了。由於八達通卡允許的餘額是 -35.0,記錄到小數點下一位,所以可以這樣運算得到餘額:605/10 – 35.0 = 25.5。

其他卡

很可惜的,悠遊卡所有資料都鎖住了,讀不到任何資訊,而摩斯卡也沒有開放的資訊。不知各位讀者有沒有什麼感應卡,一起來試試看吧。(以上範例以 Nexus 7 測試,而 Sony Xperia P 會讀取不到某些卡)

參考資料

沒有留言: