設萬維讀者為首頁 萬維讀者網 -- 全球華人的精神家園 廣告服務 聯繫我們 關於萬維
 
首  頁 新  聞 視  頻 博  客 論  壇 分類廣告 購  物
搜索>> 發表日誌 控制面板 個人相冊 給我留言
幫助 退出
回首百年的博客  
專業技術,主要研究收費系統.  
https://blog.creaders.net/u/6964/ > 複製 > 收藏本頁
我的名片
回首百年
註冊日期: 2012-11-14
訪問總量: 8,128 次
點擊查看我的個人資料
Calendar
我的公告欄
最新發布
· 從市質量監督局公布的一份標準中
友好鏈接
分類目錄
【留痕】
【滅蟲】
· 從市質量監督局公布的一份標準中
存檔目錄
05/01/2013 - 05/31/2013
11/01/2012 - 11/30/2012
發表評論
作者:
用戶名: 密碼: 您還不是博客/論壇用戶?現在就註冊!
     
評論:
從市質量監督局公布的一份標準中找尋BUG
   

上 中華人民共和國北京市質監局很久前在其官網上公布了由北京市軌道交通建設管理有限公司、北京市軌道交通指揮中心、北京市地鐵運營有限公司、北京航空航 天大學起草的北京市地方標準《軌道交通聯網收費系統標準》徵求意見稿,至今仍未撤除。 

北京市質監局徵求意見

標準內容涵蓋了北京地鐵收費系統的主要技術實現方案。

下載附件內容

其中比較有意思的是其單程票的數據結構與安全算法。

算法描述

“系統內單程票卡的數據結構”完整定義了單程類票卡的系統實現,第六節詳細定義了MAC算法,引用如下:

6  MAC計算

靜態區(發行區)MACUIDOTP的序列號(serialNumber)字段的基礎上進行計算的。

動態區MAC根據覆蓋UIDCSN、靜態區數據和動態區數據(AB)計算的CRC生成。

靜態區和動態區MAC使用不同的密鑰。

MAC上不進行分散。

80FC指令將被用來認證靜態區MAC,同時生成動態區MAC,這是在SAM中用一條指令實現的。

6.1 靜態區MAC計算

註:由卡發行商完成。

為靜態區MAC生成,從UIDCSN中計算8個輸入字節(M0M7),如下所示:

  • M1[0] = UID[0] ^ UID[6]

  • M1[1] = UID[1] ^ UID[5]

  • M1[2] = UID[2] ^ UID[4]

  • M1[3] = UID[3]

  • M1[4] = CSN[0]

  • M1[5] = CSN[1]

  • M1[6] = CSN[2]

  • M1[7] = CSN[3]

  • 使用這些作為MAC生成函數使用的輸入,將返回一個MAC

6.2 動態區MAC計算

動態區MAC計算方法如下:

首先,先利用CRC-32算法計算一個校驗和。該校驗和將覆蓋UID,CSN,靜態區和本MAC所在的動態區。因此,如果靜態區進行更新,動態區A和B都必須重新計算他們的MAC。這只會發生在卡發行或者重新發行時,不是在閘機商,所以不會對閘機的速度產生影響。

MAC校驗函數的輸入為:

  • M1[0] = UID[0] ^ UID[6]

  • M1[1] = UID[1] ^ UID[5]

  • M1[2] = UID[2] ^ UID[4]

  • M1[3] = UID[3]

  • M1[4] = CSN[0]

  • M1[5] = CSN[1]

  • M1[6] = CSN[2]

  • M1[7] = CSN[3]

  • M1 [8]  = StaticAreaMAC>>24

  • M1 [9] = StaticAreaMAC>>16

  • M1 [10] = StaticAreaMAC>>8

  • M1 [11] = StaticAreaMAC

  • M1 [12] = crc>>24

  • M1 [13] = crc>>16

  • M1 [14] = crc>>8

  • M1 [15] =  crc

  • M1 [16] = M1[12] ^ M1[13] ^ M1[14] ^ M1[15]

M1數據作為80FC命令的一部分送往SAM。如果靜態區MAC有效,這可以同時生成5個ID(每個6字節)。

使用這30個字節作為一個240bit的數組(m[0]m[239]),一個12bitMAC生成如下:

Where:

A[x] and B holds 12 bit values.

A[0]=m[0]|m[1].....m[11] that is 12bits.

A[1]=m[12]|m[13].....m[23] that is 12bits

.........

A[20]=m[227]|m[228]....m[239] that is 12bits

so B=A[0]^A[1]...A[20]; that is 12bits.

B is the resultant 12 bit MAC. 


如下圖:


<《軌道交通聯網收費系統標準》徵求意見稿 ——第2部分:卡數據定義>定義的票卡算法與結構


問題解析

CRC32的算法是採用了ITU-T G.706-1991標準算法沒有任何問題;

本標準中令人質疑的是基於CRC的MAC生成算法可能達不到有效強度:

先利用CRC-32算法計算一個校驗和。該校驗和將覆蓋UID,CSN,靜態區和本MAC所在的動態區。再校驗和經處理後送入SAM卡,最終得到MAC值。或如下述簡單表述:

原始數據->CRC32值->MAC運算->MAC值。

事實上,CJ/T166 建設事業IC卡應用技術》等國內外標準明確規定了MAC算法。原文如下:

9.3 安全報文傳送

      安全報文傳送的目的是保證數據的可靠性、完整性和對發送方的認證。數據完整性和對發送方的認證通過使用MAC來實現...........

............

9.3.2.4 MAC的計算

............

實現如下圖所示:


 iso/iec7816-4關於MAC算法的圖示定義

破解算法

      對於CRC32破解,網絡上已經比比皆是,我也設計一個簡單算法,請同行斧正。

目標:待破解串為原始字串,破解串為篡改的字串。原始位串與篡改串長度一致,有若干位不一致,且均不位於隊尾最後4字節,通過修改破解串最後4字節的值,使兩串的CRC32值一致;

流式計算,從左至右開始:

  1. 計算指針指向篡改串最左位;

  2. 比較指向位與原始串的對應位,如相同,則指針後移1位;如不同,則需對篡改串從該位起異或CRC32特徵字串(異或減)後,指針後移1位;

  3. 重複步驟2;

  4. 當指針指向篡改串倒數第4位時停止處理過程。

上述處理的結果,可以得到預期篡改串的倒數4節值,即可使破解串的CRC值等於原始串值。對於CRC8CRC16等等,可以推出,破解串的倒數816字節等等進行同樣過程的修改即可。 

上述算法簡單擴展,破解串目標可以為篡改串中任何位置的連續4字節。


嚴重後果

      事實上,這個標準照搬了工程項目實施的設計文件,因此對於包括卡片數據結構等技術細節均有工程實現級別的定義(北京地鐵收費系統的卡片就是照此格式化的),本標準編制的深度是否適宜旁人不好置喙,但和存在明顯弱點的加密算法共同收錄進同一份技術文獻中,對該標準指導下的收費系統將是致命的威脅。該標準編制的非常失敗,隨着上述資料在互聯網上的進一步為人所知,無疑將會發現該標準更多的問題。

      總而言之,該標準文本不僅偏離的標準編制的基本原則,內容規定廠商名稱、技術限定產品型號等違規文字;隨意創設與國家標準衝突、未經理論證明的新型加密技術,完全沒有達到標準的基本業務水平;而且由於該標準脫胎於北京地鐵收費系統工程設計文件,因此僅從本文的信息中就可完成對這個含有算法漏洞系統的攻擊,故此該文件存在嚴重泄密的嫌疑(下圖為標準中公布的系統票卡的最為重要的格式數據)。

7 票卡具體結構

      表10 定義了票卡具體結構,包括按位計算的每個數據字段的偏移量和長度..........




 
關於本站 | 廣告服務 | 聯繫我們 | 招聘信息 | 網站導航 | 隱私保護
Copyright (C) 1998-2026. Creaders.NET. All Rights Reserved.